c# .net serial-port wmi

Encontrar información sobre todos los dispositivos serie conectados a través de USB en C#



.net serial-port (2)

Mi proyecto requiere la detección de un dispositivo específico cuando está conectado a USB. La única forma en que puedo identificar este dispositivo es por su descripción / nombre del dispositivo, no por el puerto COM. Lo que he encontrado para realizar la función correcta es usar una consulta WMI y verificar la propiedad del nombre:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * from WIN32_SerialPort"); foreach (ManagementObject port in searcher.Get()) { deviceName = (string)foundPort.GetPropertyValue("Name"); ...

Inicialmente probé esto conectando mi teléfono, y la consulta devolvió el teléfono encontrado en COM3 como se esperaba. Luego, conecté otro dispositivo (un convertidor de USB a serie, que se parece más al dispositivo para el que necesito este proyecto) y la consulta simplemente no lo encontró. Sólo encuentra el teléfono. Este dispositivo, sin embargo, aparece en el puerto COM4 en el Administrador de dispositivos. Para molestarme aún más, la clase SerialPort encuentra ambos dispositivos, pero no proporciona la información que necesito para identificar el dispositivo:

string[] tempPorts = SerialPort.GetPortNames();

He leído numerosos hilos en SO y en otros lugares y no puedo encontrar una solución satisfactoria. ¿Podría alguien aclarar por qué la consulta WIN32_SerialPort no encuentra mi otro dispositivo? ¿No se considera un puerto serial Win32 por alguna razón? Y, ¿podría alguien, por favor, dirigirme hacia una solución a este problema?


Como listar todos los puertos seriales:

Hay varias clases de configuración de dispositivos definidos por el sistema disponibles para los proveedores de hardware. Los controladores correctamente escritos para COM-Ports deben usar los Ports (COM & LPT ports) -class (guid: 4d36e978-e325-11ce-bfc1-08002be10318 ). Probablemente esta clase sea utilizada por el administrador de dispositivos también.

Por lo tanto, puede usar la siguiente consulta para enumerar todos los puertos serie que también ve en devicemanager:

ManagementObjectSearcher searcher = new ManagementObjectSearcher( "root//CIMV2", "SELECT * FROM Win32_PnPEntity WHERE ClassGuid=/"{4d36e978-e325-11ce-bfc1-08002be10318}/"" ); foreach (ManagementObject queryObj in searcher.Get()) { // do what you like with the Win32_PnpEntity }

Vea esta descripción detallada de la clase Win32_PnPEntity . Debe tener todo lo que necesita para identificar su dispositivo.

Para determinar el número de puerto, examino la propiedad del nombre y la extraigo. Hasta ahora esto funciona bien, pero no sé si el número de puerto está garantizado para ser incluido en el nombre. No he encontrado ningún dispositivo de puerto serie hasta ahora, que no tenga el número de puerto incluido en el nombre.

La consulta anterior encuentra cada dispositivo de puerto serie, sin importar si se trata de un SPP bluetooth, un chip FTDI, un puerto en la placa base, una tarjeta de extensión o un puerto serie virtual generado por algún controlador de módem (es decir, Globetrotter GTM66xxW).

Para determinar el tipo de conexión (bluetooth, usb, etc.) puede examinar el ID de dispositivo (eche un vistazo a la primera parte del ID de dispositivo). Allí también puede extraer la dirección bt-mac (tenga cuidado con eso: el ID de dispositivo se ve diferente al menos en Windows 7 y Windows XP).

Con respecto a por qué algunos dispositivos no están listados con Win32_SerialPort:

Sospecho que depende de la implementación del controlador, ya que tengo algunos dispositivos USB que tienen sus puertos listados y otros que no.


Creo que veo lo que estás intentando hacer, mira este código creado con WMICodeCreator (enlace a WMICodeCreator http://www.microsoft.com/en-us/download/details.aspx?id=8572 ) de este artículo http://www.codeproject.com/Articles/32330/A-Useful-WMI-Tool-How-To-Find-USB-to-Serial-Adapto

//Below is code pasted from WMICodeCreator try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root//WMI", "SELECT * FROM MSSerial_PortName"); foreach (ManagementObject queryObj in searcher.Get()) { Console.WriteLine("-----------------------------------"); Console.WriteLine("MSSerial_PortName instance"); Console.WriteLine("-----------------------------------"); Console.WriteLine("InstanceName: {0}", queryObj["InstanceName"]); Console.WriteLine("-----------------------------------"); Console.WriteLine("MSSerial_PortName instance"); Console.WriteLine("-----------------------------------"); Console.WriteLine("PortName: {0}", queryObj["PortName"]); //If the serial port''s instance name contains USB //it must be a USB to serial device if (queryObj["InstanceName"].ToString().Contains("USB")) { Console.WriteLine(queryObj["PortName"] + " is a USB to SERIAL adapter/converter"); } } } catch (ManagementException e) { MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); }