[英]Device misdetected as serial mouse
我正在开发一种通过(虚拟)串行端口与 PC 通信的设备。 问题是我们发送的数据偶尔会被 Windows 错误地识别为总线鼠标,之后加载“Microsoft Serial Ballpoint”驱动程序,鼠标指针开始在屏幕上跳来跳去并随机点击事物。
一些谷歌搜索表明这是串行设备的一个古老而众所周知的问题,通常的解决方法是一些注册表黑客来禁用有问题的驱动程序。 然而,我们的用户有很多要求,我宁愿不要让我们的应用程序弄乱用户的注册表。 尤其是当修复依赖于 Windows 版本并且用户很可能正在使用总线鼠标时。
相反,我想通过更改我们的协议以不发送任何可能使我们被误认为鼠标的数据来避免这个问题。 唯一的问题是我不太确定要避免哪些模式。 显然微软的鼠标协议由四个字节的数据包组成,其中第一个的 MSB 被设置,最后三个的 MSB 是明确的。
只发送 7 位 ASCII 就足够了吗? 我还需要担心被检测为其他设备吗?
我自己刚刚在Windows 7 Professional x64
上遇到了这个问题,对我Windows 7 Professional x64
的解决方案是进入注册表并编辑以下值:
Location: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\sermouse
Key: Start
Value: 3
将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.
reg 编辑命令如下:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\sermouse" /V Start /T REG_DWORD /F /D 4
然后您需要重新启动计算机,它现在应该可以正确启动并且不会尝试发现串行鼠标。
祝你好运。
事实证明,Windows 中的鼠标检测通常由serenum.sys
过滤器驱动程序处理。 该驱动程序实现了对传统串行鼠标以及串行即插即用的支持。 Microsoft 甚至提供了源代码作为 WDK 示例。
在检测期间,端口切换到 1200-7-N-1 模式,同时断言DTR
+ RTS
,预计在 200 毫秒内响应,在失败的情况下重试几次。 不幸的是,对于传统鼠标,单个M
或B
字符就足以识别。
在我们的例子中,协议被重新设计以避免这些字符,现在似乎不再被错误识别。
然而,我们使用的是虚拟 USB 串行端口,对于传统的串行端口,这种方法可能有些困难,因为以不同波特率发送的任何内容都可能看起来像线路噪声。 在这种情况下,我认为最简单的解决方法可能是,正如已经建议的那样,避免进行任何未经请求的传输。
或者,通过 USB CDC 设备实际连接或拦截串行控制信号,处理DTR
或RTS
信号并延迟输出。 实际上实现即插即用协议将是一个更漂亮的选择。 据说周围有便宜的 RS232 电缆,但没有完整的控制信号,因此这种方法可能仍然失败。
我也遇到了这个问题,通过在 FTDI 驱动程序的高级属性(设备管理器中的 COM 端口属性)中禁用“串行枚举器”来修复它。 这在http://www.ftdichip.com/Support/Documents/AppNotes/AN_107_AdvancedDriverOptions_AN_000073.pdf 中有描述。
我自己也遇到过这个 Windows 错误。 这是我自己对这个主题的研究:
Microsoft 承认此错误: http : //support.microsoft.com/kb/819036首先下载他们的工具,看看它是否能解决问题。
comdisable /list
。comdisable /disable COMx
,其中 x 是端口号。这应该有望成为一个通用的解决方案。
或者,您可以在 boot.ini 中进行 hack,但我不相信这在 Vista/Win 7 中有效。我有一些来自 Cisco 系统的应用说明,描述了如何执行此操作。 如果以上方法不能解决您的问题,请告诉我。
也许这会有所帮助:我们在 FTDI FT232RL 上遇到了同样的问题。我们发现,这是我们 PCB 的硬件问题。
FTDI 数据表说明了#RESET-Pin:低电平有效复位引脚。 外部设备可以使用它来重置 FT232R。 如果不需要,可以悬空,或上拉至 VCC。
我们的应用中不需要 RESET-Pin,因此我们通过 1k 上拉将其连接到 Vcc。 似乎#RESET-Pin 的上拉导致了 FT232RL 的未定义启动,至少每隔一秒转换器,我们连接到 USB 插座就会导致设备管理器中的串行球点。 我们在#RESET-Pin 处移除了上拉电阻,因此#RESET-Pin 未连接。 从那时起,每个接口都可以正常工作,并且不再在 Windows 设备管理器中创建串行圆珠点。
如果你有一个“真正的”串口,或者一个 USB 加密狗(RS-232、RS-485,没关系)这个问题可以通过首先用终端打开有问题的串口来解决,或者你使用的任何应用程序想要监控它,然后才插入设备。为了你自己,你也应该注意在终止连接之前移除设备。
将 FTDI 芯片焊接在设备本身上,你就失败了。 我花了几轮来解释管理,一个独立通信的设备与焊接在 PCB 上的 FTDI 芯片配对 Windows 计算机不太可能通过用户友好性,无论 USB 插座看起来多么光滑在柜子上......(谢天谢地,所有这些情况都非常罕见且不寻常)
自 2010 年以来,我遇到了这个问题,串行秤头连接到电脑。 USB到串行转换器与否..我使用onkly SILABS设备的CP2102或类似设备..我通过简单地允许安装驱动程序然后在设备管理器中查找鼠标/HIDA下的圆珠笔驱动程序然后简单地禁用驱动程序来解决它, 不要卸载它只是禁用它。 然后,即使在安装了驱动程序的情况下重新启动时,Windows 似乎也会忽略作为串行鼠标的通信并使用来自输入的数据。 您还会发现,如果圆珠笔驱动程序处于活动状态,则该 COMport 正在使用中,有时会返回一个无法访问的 COM PORT...希望这对那里的人有所帮助:) Tx Ben
代码阻止 GPS 被检测为串行鼠标。
下面是 C#.net 中子程序的代码。 它检查注册表项是否设置为 4,如果没有,则发出配置命令以禁用 sermouse。 将此子例程嵌入在启动时运行的程序中,它将在 Windows 更新后更正设置。
如果您在一次又一次出现此问题时感到恼火,这可能很有用
private void Stop_sermouse()
{
string k =
"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\sermouse";
object v = Microsoft.Win32.Registry.GetValue(k, "Start", null);
if (v==null)
{
MessageBox.Show("No Registry Key for sermouse");
}
else
{
string sr = v.ToString();
if (sr == "4")
{; }
else
{
DialogResult mbox = MessageBox.Show("disable sermouse ? " + v.ToString(), "Found sermouse enabled! ", MessageBoxButtons.YesNo);
if (mbox == DialogResult.Yes)
{
// prepare a small job to issue confuguration command
ProcessStartInfo s = new ProcessStartInfo("cmd.exe", "/c sc config sermouse start=disabled");
Process p = new Process();
s.Verb = "runas"; // Must run as administrator
s.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
p.StartInfo = s;
// and run the command
p.Start();
//check if the registry is modified indeed
v = Microsoft.Win32.Registry.GetValue(k, "Start", null);
sr = v.ToString();
if (sr == "4")
{
MessageBox.Show("finished ''sc config sermouse start=disabled'' but not succesfull in registry!");
}
else
{
MessageBox.Show("sermouse is disabled");
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.