web-dev-qa-db-fra.com

Obtention d'informations sur le port série

J'ai du code qui charge les ports série dans une combo-box:

     List<String> tList = new List<String>(); 

     comboBoxComPort.Items.Clear();

     foreach (string s in SerialPort.GetPortNames())
     {
        tList.Add(s);
     }

     tList.Sort();
     comboBoxComPort.Items.Add("Select COM port...");
     comboBoxComPort.Items.AddRange(tList.ToArray());
     comboBoxComPort.SelectedIndex = 0;

Je voudrais ajouter les descriptions de port (similaires à celles qui sont affichées pour les ports COM dans le Gestionnaire de périphériques) à la liste et trier les éléments de la liste qui se trouvent après l'index 0 (résolu: voir l'extrait ci-dessus). Quelqu'un a-t-il des suggestions pour ajouter les descriptions de port? J'utilise Microsoft Visual C # 2008 Express Edition (.NET 2.0). Toutes les pensées que vous pourriez avoir seraient appréciées. Merci.

31
Jim Fell

Il y a un publication sur ce même problème sur MSDN :

Obtenir plus d'informations sur un port série en C #

Salut Ravenb,

Nous ne pouvons pas obtenir les informations via le type SerialPort. Je ne sais pas pourquoi vous avez besoin de ces informations dans votre candidature. Cependant, il y a un thread résol avec la même question que vous. Vous pouvez y consulter le code et voir s'il peut vous aider.

Si vous avez d'autres problèmes, n'hésitez pas à me le faire savoir.

Cordialement, Bruce Zhou

Le lien dans ce post va à celui-ci:

Comment obtenir plus d'informations sur le port à l'aide de System.IO.Ports.SerialPort

Vous pouvez probablement obtenir ces informations à partir d'une requête WMI. Découvrez cet outil pour vous aider à trouver le bon code. Pourquoi voudriez-vous cependant? Ce n'est qu'un détail pour un émulateur USB, les ports série normaux n'en auront pas. Un port série est simplement connu par "COMx", rien de plus.

16

MODIFIER: Désolé, j'ai passé votre question trop rapidement. Je me rends compte maintenant que vous cherchez une liste avec le nom du port + la description du port. J'ai mis à jour le code en conséquence ...

À l'aide de System.Management, vous pouvez interroger tous les ports et toutes les informations pour chaque port (tout comme le Gestionnaire de périphériques ...)

Exemple de code (assurez-vous d'ajouter une référence à System.Management):

using System;
using System.Management;
using System.Collections.Generic;
using System.Linq;
using System.IO.Ports;        

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var searcher = new ManagementObjectSearcher
                ("SELECT * FROM WIN32_SerialPort"))
            {
                string[] portnames = SerialPort.GetPortNames();
                var ports = searcher.Get().Cast<ManagementBaseObject>().ToList();
                var tList = (from n in portnames
                            join p in ports on n equals p["DeviceID"].ToString()
                            select n + " - " + p["Caption"]).ToList();

                tList.ForEach(Console.WriteLine);
            }

            // pause program execution to review results...
            Console.WriteLine("Press enter to exit");
            Console.ReadLine();
        }
    }
}

Plus d'informations ici: http://msdn.Microsoft.com/en-us/library/aa394582%28VS.85%29.aspx

40
code4life

Utiliser l'extrait de code suivant

Il donne la sortie suivante lors de son exécution.

serial port : Communications Port (COM1)
serial port : Communications Port (COM2)

N'oubliez pas d'ajouter

using System;
using System.Management;
using System.Windows.Forms;

Ajoutez également une référence à system.Management (par défaut, il n'est pas disponible)

C #

private void GetSerialPort()
{

    try
    {
        ManagementObjectSearcher searcher = 
            new ManagementObjectSearcher("root\\CIMV2", 
            "SELECT * FROM Win32_PnPEntity"); 

        foreach (ManagementObject queryObj in searcher.Get())
        {
            if (queryObj["Caption"].ToString().Contains("(COM"))
            {
                Console.WriteLine("serial port : {0}", queryObj["Caption"]);
            }

        }
    }
    catch (ManagementException e)
    {
        MessageBox.Show( e.Message);
    }

}

VB

  Private Sub GetAllSerialPortsName()
        Try
            Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_PnPEntity")
            For Each queryObj As ManagementObject In searcher.Get()
                If InStr(queryObj("Caption"), "(COM") > 0 Then
                    Console.WriteLine("serial port : {0}", queryObj("Caption"))
                End If
            Next
        Catch err As ManagementException
            MsgBox(err.Message)
        End Try
    End Sub

Mise à jour: vous pouvez également vérifier

if (queryObj["Caption"].ToString().StartsWith("serial port"))

au lieu de

if (queryObj["Caption"].ToString().Contains("(COM"))
29
Sachin Chavan

J'ai essayé tellement de solutions ici qui ne fonctionnaient pas pour moi, affichant seulement certains des ports. Mais ce qui suit montrait Tous et leurs informations.

        using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%(COM%'"))
        {
            var portnames = SerialPort.GetPortNames();
            var ports = searcher.Get().Cast<ManagementBaseObject>().ToList().Select(p => p["Caption"].ToString());

            var portList = portnames.Select(n => n + " - " + ports.FirstOrDefault(s => s.Contains(n))).ToList();

            foreach(string s in portList)
            {
                Console.WriteLine(s);
            }
        }
    }
16
humudu

Je ne sais pas trop ce que vous entendez par "trier les éléments après l'index 0", mais si vous voulez simplement trier le tableau de chaînes renvoyé par SerialPort.GetPortNames(), vous pouvez utiliser Array.Sort .

2
Heinzi