GPS 被检测为串行鼠标

Jea*_*ôté 1 mouse gps serial

我不确定这个问题是否在正确的 stackexchange 站点中,因为它是编程和硬件的混合体。管理员,请随意将其移动到另一个 stackexchange 站点。

这是问题所在:

我编写了一个小型应用程序(C++ MFC),它通过串行端口(COM 1)读取 GPS(输出 NMEA 的 Garmin)的输出。到目前为止,一切都运行良好,但为了进行现场测试,我们需要在没有 COM 端口的笔记本电脑上使用它。

所以我们在测试阶段购买了一根 SABRENT USB 转串口线。我安装了电缆的驱动程序,一切正常。但是每次我们拔下/重新插入电缆或每次重新启动计算机时,GPS 都会被检测为串行鼠标。当检测到 GPS 为串行鼠标时,鼠标开始到处移动,随机单击和双击导致重大问题。

使用我计算机上的物理 COM 端口从未发生过这种情况。

以下是我阅读并尝试过但不起作用的解决方案:

  1. 电脑开机完成后才插USB线:好像只有用户不拔掉USB线再插才行。由于在故障排除时插拔GPS是很常见的事情,因此无法使用该解决方案。此外,重新启动后插入不是一个稳定的解决方案,因为这个 GPS 将永久安装到卡车中的计算机上,技术人员对计算机知之甚少,我不希望他们在连接之前等待计算机重新启动全球定位系统。
  2. 将键 SkipEnumerations 添加到导致错误的 COM 端口的注册表中:这无法完成,因为每次插入 USB 时,都会创建一个虚拟 COM 端口,并且数字非常随机(COM6、COM7 等)。此外,虚拟 COM 端口不在注册表中。
  3. 禁用检测到的串行鼠标:这是不可能的,因为当检测到鼠标时,我无法再控制我的普通鼠标,这完全是一场混乱。一旦我拔下 USB 电缆,鼠标就会从设备管理器中消失,所以为时已晚。

Jde*_*eBP 6

由于人们将使用 Google WWWW 找到这个,这里有一个稍微概括的答案。

串行端口可以连接到许多不同的东西。他们不只是与调制解调器交谈。例如,他们还可以与鼠标或图形输入板交谈。有一个完整的规范,即即插即用外部 COM 设备规范,处理即插即用枚举如何在串行端口上工作。不幸的是,您的 GPS 接收器不是一个合适的即插即用串行设备,它发送到主机的连续数据流会混淆串行端口即插即用枚举协议。

您的 USB 适配器电缆本身可能正在执行即插即用自动检测。

USB 设备具有向主机报告的类型,即所谓的设备类。在 USB 世界观中,适配设备可能是串行端口设备类型(通信设备类设备类)或鼠标设备类型(人机接口设备设备类)。已知有几种 USB↔RS-232 适配器电缆会根据检测到的连接到其 RS-232 接口的内容来决定它们向主机报告的 USB 设备类别。他们将尝试与设备通信,自动检测它是哪种串行设备,并相应地更改自己的设备类别。如果 GPS 接收器在他们看来就像鼠标,他们就会将自己报告为 USB HID 设备。

在这种情况下,您正确的第一步是将适配器电缆更换为不执行此自动检测的适配器电缆。您可以通过在 Windows 设备管理器中查看 USB 设备并查看它是 USB HID 还是 USB CDC 设备来了解是否发生了这种情况。

从我从供应商的手册中可以看出,Sabrent USB↔RS-232 适配器并不是那么智能;虽然不清楚“K”和“M”口味之间的区别是什么,这可能是一个因素。但是,在这种情况下,您并没有摆脱困境,因为还有第二轮自动检测:

Windows 可能正在执行即插即用自动检测。

Windows,当它发现它有一个串行端口时,会尝试找出连接到该端口的内容;与设备握手并确定其类型。然后调用适当的设备驱动程序。

这里有两个讽刺。第一:这意味着一个“智能”USB↔RS-232 适配器,它本身已经完成了握手并确定它是一个 CDC 设备而不是一个 HID 设备,可以进行第二轮握手,因为 Windows本身会尝试以确定此串行端口连接到什么。第二:即使在超级 I/O 芯片中没有连接到 I/O 连接器的 RS-232 主板逻辑的机器中,Windows 串行端口设备驱动程序也在尝试检查物理连接到端口的设备。

有几种方法可以解决这个问题:

  • sermouse完全禁用驱动程序。 这是一个简单的改变它的启动类的问题,通过直接调整注册表或使用 Windows 服务管理器,从自动到手动。在sermouse当驾驶员被调用serenum总线驱动程序检测连接到串行端口的鼠标。如果sermouse驱动程序设置为手动,则它不会自动启动,也不会为(错误地)自动检测到的新“鼠标”创建“鼠标”设备对象。自动检测,由完成serenum仍然会发生;并且设备管理器可能会报告由于驱动程序未启动而无法驱动设备。此外,端口当然不会被完全识别并列为通信设备。毕竟,系统认为它是一只老鼠。

  • 做微软自 Windows NT 5 时代以来一直说要做的事情。 微软知识库文章 283063准确描述了这种情况,并指出微软serenum十年前更新了它的驱动程序,一直追溯到 2001 年,包括一个绕过设施. 需要在注册表中找到串行设备特定实例的设备参数信息,并向其添加SkipEnumerations值,以停止serenum尝试枚举它。知识库文章中提供了完整的详细信息,包括在具有不同 HAL 的系统上的串行设备的注册表中查找的位置。

    是的,这些东西在注册表中,而不是“虚”。如果您正在寻找“虚拟 COM 端口”,那么您正在寻找错误的东西。阅读文章并按照说明进行操作。

  • 使用 Microsoft 自 Windows NT 5.2 以来一直提供的工具来解决此问题。 此工具的名称略有误导COMDisable,有关获取和使用它的说明位于Microsoft 知识库文章 819036 中。它本质上做与上面相同的注册表修改,以改变serenum设备驱动程序的行为,而无需费力地定位设备参数在注册表中的位置。