在C#中查找有关通过USB连接的所有串行设备的信息

我的项目需要在连接到USB时检测特定设备。 我可以识别此设备的唯一方法是通过其描述/设备名称,而不是com端口。 我发现执行正确的function是使用WMI查询并检查name属性:

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

我最初通过连接手机对此进行了测试,查询按预期返回了COM3上找到的手机。 然后,我连接了另一个设备(一个USB到串行转换器,它更像我需要这个项目的设备),查询根本找不到它。 它只能找到手机。 但是,此设备显示在设备管理器中的端口COM4上。 为了更多地讨论我,SerialPort类找到了两个设备,但它没有提供识别设备所需的信息:

  string[] tempPorts = SerialPort.GetPortNames(); 

我在SO和其他地方阅读过很multithreading,但找不到满意的解决方案。 有人可以澄清为什么WIN32_SerialPort查询找不到我的其他设备? 是不是因为某种原因被认为是win32串口? 并且,有人可以指出我解决这个问题的方向吗?

如何列出所有串口:

硬件供应商可以使用多个系统定义的设备安装类 。 正确编写的COM-Ports驱动程序应使用Ports (COM & LPT ports)类(guid: 4d36e978-e325-11ce-bfc1-08002be10318 )。 该类也可能由设备管理器使用。

因此,您可以使用以下查询列出您在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 } 

请参阅Win32_PnPEntity -class的详细说明。 您应该拥有识别设备所需的一切。

为了确定端口号,我检查了name属性并将其解压缩。 到目前为止这个工作正常,但我不知道端口号是否保证包含在名称中。 到目前为止,我还没有找到任何串口设备,它没有包含在名称中的端口号。

以上查询查找每个串口设备,无论是蓝牙SPP,FTDI芯片,主板上的端口,扩展卡还是某些调制解调器驱动程序生成的虚拟串口(即Globetrotter GTM66xxW)。

要确定连接类型(蓝牙,USB等),您可以检查deviceid(查看deviceid的第一部分)。 在那里你也可以提取bt-mac地址(注意:至少在Windows 7和Windows XP上,deviceid看起来不同)。

关于为什么某些设备未与Win32_SerialPort一起列出:

我怀疑它取决于驱动程序的实现,因为我有一些usb设备可以列出他们的端口,而有些则没有。

我想我知道你要做什么,看看这篇使用WMICodeCreator编写的代码(链接到WMICodeCreator http://www.microsoft.com/en-us/download/details.aspx?id=8572 ) ://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); }