Obtener información de puerto serie

Tengo un código que carga los puertos serie en un cuadro combinado:

List tList = new List(); 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; 

Me gustaría agregar las descripciones de los puertos (similares a las que se muestran para los puertos COM en el Administrador de dispositivos) a la lista y ordenar los elementos en la lista que están después del índice 0 (resuelto: ver el fragmento anterior). ¿Alguien tiene alguna sugerencia para agregar las descripciones del puerto? Estoy usando Microsoft Visual C # 2008 Express Edition (.NET 2.0). Cualquier pensamiento que pueda tener será apreciado. Gracias.

Hay una publicación sobre este mismo problema en MSDN :

Obtener más información sobre un puerto serie en C #

Hola Ravenb,

No podemos obtener la información a través del tipo SerialPort. No sé por qué necesita esta información en su aplicación. Sin embargo, hay un hilo resuelto con la misma pregunta que tú. Puede consultar el código allí y ver si puede ayudarlo.

Si tiene algún otro problema, no dude en hacérmelo saber.

Un saludo, Bruce Zhou

El enlace en esa publicación va a este:

Cómo obtener más información sobre el puerto utilizando System.IO.Ports.SerialPort

Probablemente pueda obtener esta información de una consulta WMI. Vea esta herramienta para ayudarlo a encontrar el código correcto. ¿Por qué te importaría? Esto es solo un detalle para un emulador USB, los puertos seriales normales no tendrán esto. Un puerto serie es simplemente conocido por “COMx”, nada más.

EDITAR: Perdón, compré rápidamente tu pregunta demasiado rápido. Ahora me doy cuenta de que estás buscando una lista con el nombre del puerto + descripción del puerto. He actualizado el código en consecuencia …

Usando System.Management, puede consultar todos los puertos y toda la información para cada puerto (al igual que Device Manager …)

Código de muestra (asegúrese de agregar una referencia a 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().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(); } } } 

Más información aquí: http://msdn.microsoft.com/en-us/library/aa394582%28VS.85%29.aspx

Use el siguiente fragmento de código

Da el siguiente resultado cuando se ejecuta.

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

No te olvides de agregar

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

También agregue referencia a system.Management (de manera predeterminada no está disponible)

DO#

 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 

Actualización: también puede verificar

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

en lugar de

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

Intenté tantas soluciones aquí que no funcionó para mí, solo mostrando algunos de los puertos. Pero a continuación se muestran todos ellos y su información.

  using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%(COM%'")) { var portnames = SerialPort.GetPortNames(); var ports = searcher.Get().Cast().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); } } } 

No estoy muy seguro de lo que quiere decir con “ordenar los elementos después del índice 0”, pero si solo desea ordenar la matriz de cadenas devuelta por SerialPort.GetPortNames() , puede utilizar Array.Sort .

 this.comboPortName.Items.AddRange( (from qP in System.IO.Ports.SerialPort.GetPortNames() orderby System.Text.RegularExpressions.Regex.Replace(qP, "~\\d", string.Empty).PadLeft(6, '0') select qP).ToArray() );