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

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

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

据我所知,编写该代码的前提是没有人会拔下电缆。在启动软件后,我发现没有任何逻辑可以检测到这种情况。当您重新插入电缆时,它会失败-即使重新插入电缆后,它也会默默地产生读取和写入错误。您必须重新启动该程序,然后它才能再次运行。

我对串行和USB的经验很少,对如何开始解决此问题有点茫然。

谁能说出为什么会这样吗?

杂项详细信息(如果它们可能相关):

USB串行代码在C++ DLL中

VS2008

FTDIBUS USB/串行驱动程序

Windows XP和Win7

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

最佳答案

正如雷蒙德·陈(Raymond Chen)的博客“旧事物”(Old New Thing)所述,以及上面的评论者所述:

  • https://blogs.msdn.com/b/oldnewthing/archive/2004/11/10/255047.aspx

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

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

    制造商明确指出某些FTDI设备存在此问题:
  • http://www.ftdichip.com/Support/Knowledgebase/index.html?ignorehardwareserialnumber.htm
  • 关于c++ - 正在创建重复的USB虚拟串行端口-这可能是什么原因造成的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10554192/

    10-11 22:59
    查看更多