2010-05-14 62 views
24

tengo algo de código que carga los puertos serie en un cuadro combinado:Conseguir Serial Port Información

 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; 

me gustaría añadir las descripciones de puerto (similares a los que se muestran para los puertos COM en el dispositivo Administrador) a la lista y ordenar los elementos en la lista que están después del índice 0 (resuelto: ver el fragmento de arriba). ¿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.

+0

Tome un vistazo a http://stackoverflow.com/questions/1378288/c-custom-combobox-sorting – volody

+0

¿Qué hay de almacenar el resultado de SerialPort.GetPortNames() en una variable, su clasificación y luego bucle –

Respuesta

13

Hay una post about this same issue on 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 solved thread con la misma pregunta que usted. Puede consultar el código allí y ver si puede ayudarlo.

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

Saludos, Bruce Zhou

El enlace en ese puesto va a éste:

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

Probablemente pueda obtener esta información de una consulta WMI. Consulte this tool para 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.

+0

El enlace al hilo resuelto tenía el código que estaba buscando. Un poco viejo pero funciona para obtener el número de puerto COM de PID y VID. Gracias +1 – ppumkin

+14

Algunas respuestas dolorosamente inexpertas en esas citas. Hay muchas razones obvias para querer esta información. Si desea que un usuario elija un puerto para usar, desea mostrar el nombre del dispositivo (no es 1995, por lo que no está bien proporcionar una lista de puertos COM) y si está trabajando con un dispositivo conocido específico, puede usar la información del dispositivo para elegir automáticamente el puerto correcto. –

1

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 usar Array.Sort.

+0

He agregado detalles a mi pregunta original. Gracias. –

25

Uso siguiente fragmento de código

Se da salida siguiente cuando se ejecuta.

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

No se olvide de añadir

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

también añadir una referencia a system.Management (por defecto no está 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 

Actualización: También puede comprobar si hay

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

en lugar de

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

Tuve que incluir una comprobación nula ya que mi ciclo se evaluó 82 veces con 3 coincidencias. El resto devolvió nulo. if ((queryObj ["Caption"]! = Null) && (queryObj ["Caption"]. ToString(). Contains ("(COM"))) – Larry

31

EDIT: Lo siento, la cremallera más allá de su 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, se puede consultar a todos los puertos, y toda la información para cada puerto (al igual que el Administrador de dispositivos ...)

Código de la muestra (asegúrese de añadir 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<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(); 
     } 
    } 
} 

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

0
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() 
); 
+6

En lugar de solo publicar un bloque de código, * explique * por qué este código resuelve el problema planteado. Sin una explicación, esta no es una respuesta. –

4

probé tantas soluciones de aquí que no funcionaron 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<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); 
      } 
     } 
    } 
Cuestiones relacionadas