0

我必须支持越来越多的硬件,至少按照今天的标准,这些硬件被认为是遗留的。几乎所有这些设备的共同点是 FTDI FT232 UART 芯片,它充当串行到 USB 转换器。Windows 将其视为标准 COM 端口,尽管它是虚拟化的。

因此,以编程方式识别这些设备很麻烦。由于它们都使用相同的芯片(或类似的),因此通过典型的硬件 ID 进行查询是没有帮助的,因为它总是相同的。是否有任何其他指标可用于识别设备?

我当前的解决方案是遍历所有活动的串行端口,并以所有常见的波特率发出预先知道的“hello”命令。如果我以测试的波特率在该端口上收到响应,则假定找到了感兴趣的设备。一些伪代码:

for each(Serial Port)
{
    for each(Device Definition)
    {
        for each(Baud Rate)
        {
            WriteToPort(Device Definition.helloString, Baud Rate)
            ReadPort(response)

            if(response)
                Serial Port = this device // break loop
            else
                continue;
        }
    }
}

这工作正常,但充其量是不可靠且缓慢的,因为我必须等待每个测试波特率的读取超时,乘以实际连接到系统的每个设备(可以有一个或多个)。对于必须支持的每个新硬件,这都会变慢。

此代码的特点之一是它“Just Works”™,用户不必大惊小怪地识别他们的设备和设置 COM 连接。很明显,我的方法不可扩展。除了授权用户和放弃我的软件的一项可兑换品质之外,我还能做些什么吗?

编辑:我想用一些演示问题的视觉效果来更新我的问题。接受的答案有一些信息丰富的信息,但是当我决定尝试实施时,我仍然不确定如何进行。

考虑我的注册表中的以下两个条目:在此处输入图像描述

它们都共享相同的供应商 ID、硬件 ID 以及几乎所有其他可区分的属性。但是,众所周知,它们是不同的设备。它们唯一的共同点是通信接口,也就是 FTDI 芯片。知道 PortName / COM 地址根本没有帮助,因为他们从系统收到的数字是任意的……无论是下一个。

红色圈出的数字是怎么产生的?据我所知,这是唯一有用的信息,因为设备似乎接收到类似的序列号附加到它们的条目中。

下图显示了一个实际有用的条目:在此处输入图像描述

列出了制造商,带有注册的供应商和硬件 ID,并且有连接设备的描述。这个我可以做点什么。不幸的是,这似乎是例外而不是规则。

有没有其他方法可以继续识别这些设备?跨设备并行运行检查将提供小幅提升,但真正的瓶颈是根据命令集测试波特率。

4

1 回答 1

1

由于您可以并行查询所有设备,因此此方法可跨设备扩展,但不能跨协议/波特率扩展。

每个 USB 设备都可以显示其制造商、描述、序列号等。我非常怀疑这些实际上是否相同,因为尽管使用了 FTDI 芯片,供应商可以放置自定义的制造商和描述字符串,同时保留 VID并且 PID 不变,以避免需要支付签署驱动程序的自定义变体所需的“税”。

对于 FTDI 设备,有一种相当粗略的特定于驱动程序的方式来获取设备信息。或者,您可以使用始终存在的 D2XX 功能,查询那里的设备,用于FT_GetComPortNumber获取端口号,然后继续使用常规 Windows 样式的 com 端口 API 将其打开。

如果这些设备确实没有什么不同(请确保首先检查!!!),那么您能做的最好的事情就是缓存最后在给定 com 端口号上工作的协议,并首先为给定的 com 尝试该协议港口。如果失败,则枚举其他协议。

于 2013-10-16T13:19:13.760 回答