获取USB适配器的com端口号

我正在尝试编写一个程序,使用arduino mega和基于FTDI的USB转RS485适配器。

我想让程序用户友好,因此我不会让用户手动检查com端口号,但我想自动检测它。 这是代码的一小部分

ManagementScope scope = new ManagementScope(); SelectQuery query = new SelectQuery("SELECT * FROM Win32_SerialPort"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); try { foreach (ManagementObject item in searcher.Get()) { String description = item["Description"].ToString(); String deviceID = item["DeviceID"].ToString(); Console.WriteLine("Porta " + description + " deviceID " + deviceID); if (description.Contains("USB Serial Port")) return deviceID; } } catch (ManagementException) { } 

我无法理解的一点是为什么我可以找到Arduino的USB串口(匹配description.Contains("Arduino") )而不是USB RS485端口的com端口。

你知道为什么会这样吗? 是查询SELECT * FROM Win32_SerialPort错了吗?

好吧,在研究了几个论坛之后,我发现如果我运行查询SELECT * FROM Win32_PnPEntity则会列出与USB / RS485适配器关联的com端口。

但我真的不明白为什么arduino的串口是由查询显示的,而另一个端口是另一个查询….我的意思是,那些都是uSB < - >串口适配器!

我没有USB < - > RS485适配器,但我怀疑它们不属于“串口”类别(似乎保留用于RS232接口),这可能是它们不出现在Win32_SerialPort查询结果。

要检测和Arduino板的连接,我会查看此注册表项:

 HKLM\HARDWARE\DEVICEMAP\SERIALCOMM 

对于像这样的条目

 \Device\VCP0 

(VCP是要查找的前缀)。

也许您也可以查看此注册表项,或者查看其父键DEVICEMAP,并查看连接FTDI RS485适配器时会发生什么。 此时检测其中一个注册表项内容的更改应该是直截了当的。

HTH

这可能对你有用。 我用它来动态读取系统上Arduino的端口号。 这里

description.Contains( “uino”)

是为了两个板的变量寻找Arduino和Genuino关键字。

  public string detectArduinoPort() { ManagementScope mScope = new ManagementScope(); SelectQuery query = new SelectQuery("SELECT * FROM Win32_SerialPort"); ManagementObjectSearcher objectList = new ManagementObjectSearcher(mScope, query); try { foreach (ManagementObject obj in objectList.Get()) { string description = obj["Description"].ToString(); string deviceId = obj["DeviceID"].ToString(); if (description.Contains("uino")) { return deviceId; } } } catch (Exception) { } return ""; } 

基本上,这是由于HID(人机接口设备)

我认为这是由于arduino董事会提供的HID。 Arduino硬件(以及微控制器)使用HID与PC直接通信(因此,不需要额外的设备)。 HID可以表现为鼠标,键盘或简单的串行设备(它“简单地”将自己声明为PC作为串行编译器)。 所以,不知何故,与PC通信时有一些“智能”的方式。

另一方面,USBtoSerial转换器和一些Arduino板,如嵌入FTDI(或CH340)的Arduino Nano,这些“被迫”表现为正常的因素,因为没有智能背后(HID背后的那个) )。