正在创建重复的USB虚拟串行端口 - 可能导致此问题?

时间:2012-05-11 15:19:11

标签: c++ windows usbserial

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

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

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

据我所知,编写的代码假设没有人会拔掉电缆。在SW启动后,我没有看到任何逻辑来检测这种情况。当你重新插上电缆时它会失败 - 即使在重新插入电缆后也会无声地产生读写错误。你必须重新启动它才能再次运行。

我的串口和USB体验非常少,而且如何开始解决此问题我感到有些失落。

有人能说明为什么会这样吗?


混杂。细节,如果它们可能相关:

USB串行代码在C ++ DLL中

VS2008

FTDIBUS USB /串行驱动程序

Windows XP和Win7

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

Screen shot of Registry entries

1 个答案:

答案 0 :(得分:2)

正如Raymond Chen的博客中所解释的那样,Old New Thing,以及上述评论者:

总结:

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

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

制造商特意将一些FTDI设备称为出现此问题: