doy*_*nax 36 windows embedded mouse serial-port plug-and-play
我正在研究一种通过(虚拟)串口与PC通信的设备.问题是我们偶尔发送的数据被Windows错误地识别为总线鼠标,然后加载"Microsoft Serial Ballpoint"驱动程序并且鼠标指针开始在屏幕上跳转并随机点击.
一些谷歌搜索显示这是串行设备的一个古老而众所周知的问题,其中通常的解决方法是一些注册表黑客攻击来禁用有问题的驱动程序.然而,我们的用户要求很多,而且我宁愿不让我们的应用程序弄乱用户的注册表.特别是当修复程序依赖于Windows版本并且用户可能正在使用总线鼠标时.
相反,我想通过更改我们的协议以避免发送任何可能让我们误认为鼠标的数据来避免此问题.唯一的问题是,我不太确定要避免哪些模式.显然,微软的鼠标协议由四个字节的数据包组成,其中第一个的MSB被设置,而后三个的MSB是明确的.
只发送7位ASCII就足够了吗?有没有其他设备我需要担心被检测到?
Ser*_*lis 33
我刚刚遇到这个问题Windows 7 Professional x64,一个对我有用的解决方案是进入注册表并编辑以下值:
Location: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\sermouse
Key: Start
Value: 3
Run Code Online (Sandbox Code Playgroud)
更改Value为4,它将停止发生此问题.
0 Boot (loaded by kernel loader). Components of the driver stack for the boot (startup) volume must be loaded by the kernel loader.
1 System (loaded by I/O subsystem). Specifies that the driver is loaded at kernel initialization.
2 Automatic (loaded by Service Control Manager). Specifies that the service is loaded or started automatically.
3 Manual. Specifies that the service does not start until the user starts it manually, such as by using Device Manager.
4 Disabled. Specifies that the service should not be started.
Run Code Online (Sandbox Code Playgroud)
reg edit命令如下:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\sermouse" /V Start /T REG_DWORD /F /D 4
Run Code Online (Sandbox Code Playgroud)
然后,您需要重新启动计算机,该计算机现在应该正确启动,而不是尝试发现串行鼠标.
祝好运.
事实证明,Windows中的鼠标检测通常由serenum.sys过滤器驱动程序处理.该驱动程序实现了对传统串行鼠标的支持以及串行即插即用.微软甚至提供了源代码作为WDK示例.
在检测期间,端口切换到1200-7-N-1模式,同时断言DTR+ RTS在200 ms内预期响应,并在发生故障时重试几次.不幸的是,对于传统鼠标,单个M或B字符就足以作为标识.
在我们的案例中,协议被重新设计以避免这些字符,现在看来不再被错误识别.
然而,我们使用虚拟USB串行端口,对于传统的串行端口,这种方法可能有些困难,因为以不同波特率发送的任何内容都可能看起来像线路噪声.在这种情况下,我认为最简单的解决方法可能是,如已经建议的那样,可以避免进行任何未经请求的传输.
或者,串行控制信号实际上连接或由USB CDC设备拦截,处理DTR或RTS信号并保持输出.实际上,实现即插即用协议将是一个更加狡猾的选择.据说周围有廉价的RS232电缆没有完整的控制信号,但这种方法可能仍然失败.
我也遇到了此问题,通过在FTDI驱动程序的高级属性(“设备管理器”中的COM端口的属性)中禁用“串行枚举器”来解决此问题。在http://www.ftdichip.com/support/Documents/AppNotes/AN_107_AdvancedDriverOptions_AN_000073.pdf中对此进行了描述。
我自己也遇到过这个Windows bug。这是我自己对该主题的研究:
Microsoft 承认此错误:http://support.microsoft.com/kb/819036 首先下载他们的工具,看看它是否可以解决问题。
comdisable /list执行程序时写入。comdisable /disable COMx其中 x 是端口号。这有望成为一个通用的解决方案。
或者,您可以破解 boot.ini,但我不相信这在 Vista/Win 7 中有效。我有一些来自 Cisco 系统的应用说明,描述了如何执行此操作。如果以上方法不能解决您的问题,请告诉我。