给定 COM 端口,如何找到 USB 串行适配器的序列号?

Posted

技术标签:

【中文标题】给定 COM 端口,如何找到 USB 串行适配器的序列号?【英文标题】:How to find serial number of USB serial adapter, given the COM port? 【发布时间】:2020-02-10 15:39:40 【问题描述】:

我想从 Windows COM 端口名称 (COM11) 获取提供该 COM 端口的 USB 设备的序列号(如果这很重要,我目前正在使用 FTDI 适配器)。

我可以使用SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, NULL, NULL, DIGCF_PRESENT) 枚举系统上的端口,然后我可以使用SetupDiEnumDeviceInfoSetupDiGetDeviceRegistryProperty 从硬件ID 中获取vid/pid。

但我似乎无法找到获取序列号的方法。

我们的目标是使用序列号对串行适配器进行编程,以识别它们在我们拥有的模拟器程序中的用途(因此用户不必弄清楚哪个适配器是哪个 COM 端口)。

【问题讨论】:

此页面可能会有所帮助。 FTDIChip-ID Projects 【参考方案1】:

您可以尝试使用SetupDiGetDeviceInstanceId 来获取USB 设备的Device Instance ID,它应该是USB\VID_xxxx&PID_xxxx\[ID] 形式的字符串。如果您的 USB 设备不是复合设备,那么[ID] 将是序列号。这就是libusbp 获取USB 设备序列号的方式。

如果您的设备是复合设备,则串行端口将是子设备,您必须上一层才能找到代表实际 USB 设备的父设备,该设备应该具有您关心的设备实例 ID。

在编写任何代码之前,我建议在您的设备管理器中检查设备实例 ID,它被称为“设备实例路径”。

为了让您对从包含其他信息的字符串中提取序列号感觉更好,Microsoft 在此处记录了设备实例 ID:

https://docs.microsoft.com/en-us/windows-hardware/drivers/install/device-instance-ids

【讨论】:

以上是关于给定 COM 端口,如何找到 USB 串行适配器的序列号?的主要内容,如果未能解决你的问题,请参考以下文章

带有 USB 适配器的笔记本电脑上的串行端口

使用 pyserial 识别给定 USB VID 和 PID 的 USB 到串行端口

使用pyserial测试usb到串口到usb没有输出

Linux 的虚拟串行端口

WINDOWS 上的 WebSerial API - “DOMException:无法打开串行端口。”

C#如何将COM端口更改为指定的端口