3

我有各种各样的 VCOM 设备(FTDI、CP210x 等)与我的程序交互,但我需要在开始与它们交谈之前确认它们实际上是这些设备。FTDI 的 D2XX 库允许我将产品/序列号字符串与 COM 号配对,但我确实需要一个通用的解决方案。

需要明确的是,我还需要产品、序列以及理想情况下的制造商的 USB 字符串描述符。请注意,这些VID/PID 编号不同,而是实际的字符串。如果我必须先获取字符串,然后再找出它的 COM 号,那也没关系。

我正在使用使用 MingW 交叉编译的旧 C 语言,但实际上我对如何做到这一点感到不知所措,以至于任何语言的解决方案都是向前迈出的一步。

4

2 回答 2

3

您应该查看 Windows 驱动程序工具包示例,或查看 SetupDi 函数(这些函数允许您枚举设备类型并查询信息)。这些功能记录在这里:http: //msdn.microsoft.com/en-us/library/windows/hardware/ff553567 (v=vs.85).aspx#ddk_setupdi_device_interface_functions_dg

我也发布了几次,但它是很好的示例代码:

查看 WDK 中的 USBView 示例。如果您对此不熟悉,只需运行它 - 该工具会遍历系统上的整个 USB 树,并打印出每个设备的信息和描述符列表。

在您的情况下,我将从本示例中的 RefreshTree() 函数开始,然后您可以按照代码查看它如何枚举设备。对于您找到的每个设备,您可以查看字符串描述符。

获取此示例源代码的最简单方法是安装 7.1.0 WDK,目前可在此处获得:http: //www.microsoft.com/en-us/download/details.aspx?id=11800

获得 VID/PID/序列号后,您应该能够在注册表中查找端口号。例如,CP210x 的端口号将以HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_10C4&PID_EA60\0001\Device Parameters\Port Name“COMxx”的形式定位(其中 VID=10C4,PID=EA60,serial=0001)。如果您知道设备的 VID/PID 是什么,您可以跳过 USB 搜索并简单地通过注册表解析以获取该类型的所有设备以发现它们的 COM 端口号。

您还可以在此处获取系统上所有 COM 端口的列表:HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM. 值将根据其类型列出,因此真正的串口会显示名称\Device\Serialn和数据COMxx,CP210x 会显示名称\Device\Silabsern和数据COMyy等。您可以使用名称来过滤 COM 端口的设备类型属于。

于 2013-10-28T15:05:27.753 回答
2

产品名称字符串描述符通过SetupDi.

在 Windows 7 和更高版本上,它被称为“总线报告设备描述”。在 XP 和 2000 中,它位于“位置”属性中。Vista中似乎没有。

正如您所注意到的,其他字符串描述符只能从ioctl发送到上游集线器设备的 USB 命令中获得,没有编程方式来关联它们。

不过,序列号可以通过两种方式获得,并且可能是使它们匹配的关键。

于 2013-10-29T18:24:42.453 回答