c# - usar - Obtener información de puerto serie
usar puerto serie en c# (6)
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 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.
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<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);
}
}
}
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 .
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"))
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<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
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()
);