首页 > 解决方案 > 给定COM端口,如何找到USB串行适配器的序列号?

问题描述

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

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

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

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

标签: windowsserial-portusb

解决方案


您可以尝试使用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


推荐阅读