windows - 给定COM端口,如何找到USB串行适配器的序列号?
问题描述
我想从 Windows COM 端口名称 ( COM11
) 获取提供该 COM 端口的 USB 设备的序列号(如果这很重要,我目前正在使用 FTDI 适配器)。
我可以使用SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, NULL, NULL, DIGCF_PRESENT)
枚举系统上的端口,然后我可以使用SetupDiEnumDeviceInfo
并SetupDiGetDeviceRegistryProperty
从硬件 ID 中获取 vid/pid。
但我似乎无法找到获取序列号的方法。
目标是使用序列号对串行适配器进行编程,以识别它们在我们拥有的模拟器程序中的用途(因此用户不必弄清楚哪个适配器是哪个 COM 端口)。
解决方案
您可以尝试使用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
推荐阅读
- sql - 从 oracle 中的星期几号中检索日期名称
- java - Spring的@RequestScope在注入单例bean时会自动处理代理吗?
- oracle - Oracle如何向不同模式的用户授予权限
- java - 如何从字符串中捕获日期?
- python - 从具有相同字段名称的多个表单中获取所有值而不使用表单集
- android - 在android studio中更改背景图像作为主题更改
- c++ - 处理 Boost MSM 中每个状态的错误
- hadoop - 如何清理hadoop纱线中的应用程序历史记录?
- python - 有没有办法在 python 中检测 2 个小部件上的 FocusOut 事件
- android - 在 Android 导航组件中处理 onBackPressed