如何获取VCOM设备的USB字符串描述符(Windows)?

时间:2013-10-28 07:04:30

标签: windows serial-port usb usb-descriptor

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

要清楚,我需要产品,串行和理想制造商的USB字符串描述符。请注意,这些与VID / PID编号相同,而是实际字符串。如果我必须先获取字符串,然后稍后找出它的COM编号,这是可以的。

我正在与使用MingW进行交叉编译的旧C一起工作,但实际上我对如何做到这一点感到非常失望,任何语言的解决方案都会向前迈进一步。

2 个答案:

答案 0 :(得分:2)

您应该查看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”的形式位于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_10C4&PID_EA60\0001\Device Parameters\Port Name(其中VID = 10C4,PID = EA60,serial = 0001)。如果你知道你的设备的VID / PID是什么,你可以跳过USB搜索,只需解析注册表就能让所有类型的设备发现它们的COM端口号。

您还可以在此处获取系统上所有COM端口的列表:HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM。值将根据其类型列出,因此实际串行端口将显示名称为\Device\Serialn且数据为COMxx,CP210x将显示名称为\Device\Silabsern且数据为{{ 1}}等。您可以使用该名称来过滤COM端口所属的设备类型。

答案 1 :(得分:1)

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

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

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

序列号可以双向使用,也可能是使它们匹配的关键。