如何获得VCOM设备的USBstring描述符(Windows)?

我有很多种与我的程序接口的VCOM设备(FTDI,CP210x等),但是在开始和他们交谈之前,我需要确认他们实际上是那些设备。 FTDI的D2XX库允许我将产品/串行string与COM号码配对,但我真的需要一个通用的解决scheme。

为了清楚起见,我需要产品,串行和理想制造商的USBstring描述符。 注意这些与VID / PID号码一样,但是实际的string。 如果我必须首先得到string,然后找出它的COM号码,这是可以的。

我正在用明文交叉编译好老C,但是我真的很遗憾,如何做到这一点,任何语言的解决scheme都将是一个进步。

您应该查看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端口号将以“COMxx”(其中VID = 10C4,PID = EA60,串行= 0001)的形式位于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_10C4&PID_EA60\0001\Device Parameters\Port Name )。 如果您知道设备的VID / PID是什么,您可以跳过USB搜索,并简单地通过注册表进行解析,以获取该类型的所有设备以发现其COM端口号。

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

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

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

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

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