我不确定这个问题是否在正确的 stackexchange 站点中,因为它是编程和硬件的混合体。管理员,请随意将其移动到另一个 stackexchange 站点。
这是问题所在:
我编写了一个小型应用程序(C++ MFC),它通过串行端口(COM 1)读取 GPS(输出 NMEA 的 Garmin)的输出。到目前为止,一切都运行良好,但为了进行现场测试,我们需要在没有 COM 端口的笔记本电脑上使用它。
所以我们在测试阶段购买了一根 SABRENT USB 转串口线。我安装了电缆的驱动程序,一切正常。但是每次我们拔下/重新插入电缆或每次重新启动计算机时,GPS 都会被检测为串行鼠标。当检测到 GPS 为串行鼠标时,鼠标开始到处移动,随机单击和双击导致重大问题。
使用我计算机上的物理 COM 端口从未发生过这种情况。
以下是我阅读并尝试过但不起作用的解决方案:
由于人们将使用 Google WWWW 找到这个,这里有一个稍微概括的答案。
串行端口可以连接到许多不同的东西。他们不只是与调制解调器交谈。例如,他们还可以与鼠标或图形输入板交谈。有一个完整的规范,即即插即用外部 COM 设备规范,处理即插即用枚举如何在串行端口上工作。不幸的是,您的 GPS 接收器不是一个合适的即插即用串行设备,它发送到主机的连续数据流会混淆串行端口即插即用枚举协议。
USB 设备具有向主机报告的类型,即所谓的设备类。在 USB 世界观中,适配设备可能是串行端口设备类型(通信设备类设备类)或鼠标设备类型(人机接口设备设备类)。已知有几种 USB↔RS-232 适配器电缆会根据检测到的连接到其 RS-232 接口的内容来决定它们向主机报告的 USB 设备类别。他们将尝试与设备通信,自动检测它是哪种串行设备,并相应地更改自己的设备类别。如果 GPS 接收器在他们看来就像鼠标,他们就会将自己报告为 USB HID 设备。
在这种情况下,您正确的第一步是将适配器电缆更换为不执行此自动检测的适配器电缆。您可以通过在 Windows 设备管理器中查看 USB 设备并查看它是 USB HID 还是 USB CDC 设备来了解是否发生了这种情况。
从我从供应商的手册中可以看出,Sabrent USB↔RS-232 适配器并不是那么智能;虽然不清楚“K”和“M”口味之间的区别是什么,这可能是一个因素。但是,在这种情况下,您并没有摆脱困境,因为还有第二轮自动检测:
Windows,当它发现它有一个串行端口时,会尝试找出连接到该端口的内容;与设备握手并确定其类型。然后调用适当的设备驱动程序。
这里有两个讽刺。第一:这意味着一个“智能”USB↔RS-232 适配器,它本身已经完成了握手并确定它是一个 CDC 设备而不是一个 HID 设备,可以进行第二轮握手,因为 Windows本身会尝试以确定此串行端口连接到什么。第二:即使在超级 I/O 芯片中没有连接到 I/O 连接器的 RS-232 主板逻辑的机器中,Windows 串行端口设备驱动程序也在尝试检查物理连接到端口的设备。
有几种方法可以解决这个问题:
sermouse完全禁用驱动程序。 这是一个简单的改变它的启动类的问题,通过直接调整注册表或使用 Windows 服务管理器,从自动到手动。在sermouse当驾驶员被调用serenum总线驱动程序检测连接到串行端口的鼠标。如果sermouse驱动程序设置为手动,则它不会自动启动,也不会为(错误地)自动检测到的新“鼠标”创建“鼠标”设备对象。自动检测,由完成serenum仍然会发生;并且设备管理器可能会报告由于驱动程序未启动而无法驱动设备。此外,端口当然不会被完全识别并列为通信设备。毕竟,系统认为它是一只老鼠。serenum十年前更新了它的驱动程序,一直追溯到 2001 年,包括一个绕过设施. 需要在注册表中找到串行设备特定实例的设备参数信息,并向其添加SkipEnumerations值,以停止serenum尝试枚举它。知识库文章中提供了完整的详细信息,包括在具有不同 HAL 的系统上的串行设备的注册表中查找的位置。是的,这些东西都在注册表中,而不是“虚”。如果您正在寻找“虚拟 COM 端口”,那么您正在寻找错误的东西。阅读文章并按照说明进行操作。
COMDisable,有关获取和使用它的说明位于Microsoft 知识库文章 819036 中。它本质上做与上面相同的注册表修改,以改变serenum设备驱动程序的行为,而无需费力地定位设备参数在注册表中的位置。| 归档时间: |
|
| 查看次数: |
7905 次 |
| 最近记录: |