Obtener Información del Puerto Serie


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

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

Author: Jim Fell, 2010-05-15

6 answers

Hay un post sobre este mismo tema 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 se por qué necesitas esta información en tu solicitud. Sin embargo, hay un hilo resuelto con la misma pregunta que tú. Puedes revisar el código allí, y ver si puede ayudarte.

Si tiene algún problema adicional, por favor, siéntase libre de avisarme.

Saludos cordiales, Bruce Zhou

El enlace en ese post va a este:

Cómo obtener más información sobre port usando System. IO. Ports. SerialPort

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

 15
Author: Bradley Mountford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-19 21:47:05

EDIT: Lo siento, pasé tu pregunta demasiado rápido. Ahora me doy cuenta de que está buscando una lista con el nombre del puerto + descripción del puerto. He actualizado el código en consecuencia...

Usando el Sistema.Administración, puede consultar todos los puertos y toda la información para cada puerto (al igual que el Administrador de dispositivos...)

Código de ejemplo (asegúrese de agregar referencia al Sistema.Gestión):

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

 36
Author: code4life,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-07 18:51:43

Utilice el siguiente fragmento de código

Da la siguiente salida cuando se ejecuta.

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

No olvides añadir

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

También agregue 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

Actualizar: También puede comprobar

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

En lugar de

if (queryObj["Caption"].ToString().Contains("(COM"))
 28
Author: Sachin Chavan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-20 07:50:49

Probé tantas soluciones aquí que no funcionaron para mí, solo mostrando algunos de los puertos. Pero lo siguiente muestra 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);
            }
        }
    }
 9
Author: humudu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-11 08:39:41

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 devueltas por SerialPort.GetPortNames(), puede usar Matriz.Sort .

 1
Author: Heinzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-14 22:36:42
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()
);
 -1
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-29 10:09:33