5

我从另一个离开公司的程序员那里继承了一些代码,我遇到了一个奇怪的问题,需要一些关于如何开始解决它的指导。

问题是——在半定期的基础上,我们发现正在创建重复的 USB 虚拟通信端口。例如,在我的 PC 上,当我在设备管理器中查看端口并选择“查看隐藏设备”时,我有两个相同设备的条目——一个在 COM6 上,一个在 COM8 上。

不幸的是,我们无法可靠地重现问题。我们怀疑当我们的软件运行时有人快速断开并重新连接 USB 电缆时可能会发生这种情况,但这需要确认。

据我所知,编写代码的前提是没有人会拔掉电缆。在 SW 启动后,我看不出有任何逻辑可以检测到这种情况。当您重新插入电缆时它会失败 - 即使在重新插入电缆后也会默默地产生读写错误。您必须重新启动程序才能再次工作。

我几乎没有串行和 USB 经验,甚至不知道如何开始修复这个问题。

谁能建议为什么会发生这种情况?


杂项。详细信息,以防它们可能相关:

USB 串行代码位于 C++ DLL 中

VS2008

FTDIBUS USB/串行驱动程序

Windows XP 和 Win7

重复注册表项的屏幕截图(注意所选键的值!)

注册表项的屏幕截图

4

1 回答 1

2

正如 Raymond Chen 的博客 The Old New Thing 和上面的评论所解释的那样:

总结一下:

  • 对拔出并再次插入的设备进行跟踪,因此不会每次都将它们视为新设备。
  • 通常这使用设备序列号来检测设备是否相同。
  • 但是,并非每个设备都有序列号。仅当这些设备具有相同的供应商 ID 和产品 ID 并插入相同的端口时,它们才会被视为相同的设备。如果将它们插入不同的端口,它们将被视为不同的设备。
  • 一些制造商不理解“序列号”中的“序列号”一词,并为所有设备提供相同的编号,而不是为它们提供序列号......为了解决这个问题,有一个注册表设置可用于强制这些设备被视为没有序列号。

因此,如果将没有序列号或在 Windows 注册表中标记为具有重复序列号的设备插入到之前未插入的串行端口,它将被视为新设备,而不是重新连接旧设备。这将导致您描述的“幽灵”设备。

制造商特别指出某些 FTDI 设备存在此问题:

于 2012-06-18T16:35:21.137 回答