设备被误检测为串行鼠标

时间:2012-02-10 10:12:36

标签: windows embedded serial-port mouse plug-and-play

我正在开发一种通过(虚拟)串口与PC通信的设备。问题是我们偶尔发送的数据被Windows错误地识别为总线鼠标,然后加载“Microsoft Serial Ballpoint”驱动程序,鼠标指针开始在屏幕上跳转并随机点击。

一些谷歌搜索显示这是一个古老而众所周知的串行设备问题,其中通常的解决方法是一些注册表黑客攻击来禁用有问题的驱动程序。然而,我们的用户要求很多,而且我宁愿不让我们的应用程序弄乱用户的注册表。特别是当修复程序依赖于Windows版本并且用户可能正在使用总线鼠标时。

相反,我想通过将协议更改为不发送任何可能使我们误认为鼠标的数据来避免此问题。唯一的问题是,我不太确定要避免哪些模式。 显然,微软的鼠标协议由四个字节的数据包组成,其中第一个的MSB被设置,而后三个的MSB是明确的。

只发送7位ASCII就足够了吗?有没有其他设备我需要担心被检测到?

9 个答案:

答案 0 :(得分:30)

我刚刚在Windows 7 Professional x64遇到了这个问题,对我有用的解决方案是进入注册表并编辑以下值:

Location: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\sermouse  
Key: Start  
Value: 3

Value更改为4,这样可以解决此问题。

Here is a list of all valid Start values

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 ADD "HKLM\SYSTEM\CurrentControlSet\Services\sermouse" /V Start /T REG_DWORD /F /D 4

然后,您需要重新启动计算机,该计算机现在应该正确启动,而不是尝试发现串行鼠标。

祝你好运。

答案 1 :(得分:7)

事实证明,Windows中的鼠标检测通常由serenum.sys过滤器驱动程序处理。此驱动程序实现了对传统串行鼠标以及serial plug-and-play的支持。 Microsoft甚至提供了源代码as a WDK sample

在检测期间,端口切换到1200-7-N-1模式,同时在200 ms内断言预期响应的DTR + RTS,并在发生故障时进行几次重试。遗憾的是,对于传统鼠标,单个MB字符就足以作为标识。

在我们的案例中,协议被重新设计以避免这些字符,现在看来不再被误认为。

然而,我们使用的是虚拟USB串行端口,对于传统的串行端口,这种方法可能有些困难,因为以不同波特率发送的任何内容都可能看起来像线路噪声。在这种情况下,我认为最简单的解决方法可能是,如已经建议的那样,可以避免任何未经请求的传输。

或者,串行控制信号实际连接或由USB CDC设备拦截,处理DTRRTS信号并保持输出。实际上,实现即插即用协议将是一个更加狡猾的选择。据说周围有廉价的RS232电缆没有完整的控制信号,但这种方法可能仍然失败。

答案 2 :(得分:5)

我也遇到过这个问题,通过禁用" serial enumerator"来修复它。在FTDI驱动程序的高级属性中(设备管理器中COM端口的属性)。这在http://www.ftdichip.com/Support/Documents/AppNotes/AN_107_AdvancedDriverOptions_AN_000073.pdf中有所描述。

答案 3 :(得分:4)

我自己遇到过这个Windows错误。以下是我对该主题的研究:

Microsoft承认此错误:http://support.microsoft.com/kb/819036 首先下载他们的工具,看看它是否解决了这个问题。

  • 下载&安装他们的程序。
  • 从命令提示符处运行C:\ program \ Microsoft comdisable \
  • 执行程序时写comdisable /list
  • 将显示计算机上的所有端口。
  • comdisable /disable COMx,其中x是端口号。
  • 对计算机上的所有端口执行此操作。
  • 重新启动。

这应该是一种通用的解决方案。

或者,您可以破解boot.ini,但我不相信这在Vista / Win 7中有效。我有思科系统的一些应用笔记,描述了如何执行此操作。如果上述问题无法解决您的问题,请告知我们。

答案 4 :(得分:1)

也许这会有所帮助: 我们遇到了与FTDI FT232RL相同的问题。我们发现,这是我们PCB的硬件问题。

FTDI-Datasheet表示#RESET-Pin:低电平有效复位引脚。外部设备可以使用它来复位FT232R。如果不需要,可以保持未连接状态,或上拉至VCC。

我们的应用中不需要RESET-Pin,因此我们通过1k Pull-Up将其连接到Vcc。 似乎#RESET-Pin的上拉引起了FT232RL的未定义启动,至少每隔一个转换器,我们连接到USB插座导致了无人管理器中的串行球。我们在#RESET-Pin处移除了上拉电阻,因此#RESET-Pin未连接。从那以后,每个界面都经过精心操作,并且不再在Windows设备管理器中创建串行球点。

答案 5 :(得分:1)

如果你有一个真实的"串口,或USB加密狗(RS-232,RS-485,没关系)这个问题可以通过首先用终端打开有问题的串口,或者你想用它监视它的任何应用程序来解决这个问题,以及只有插入设备。为了您自己,您还应该注意在终止连接之前移除设备。

FTDI芯片焊接在设备本身上,你就被破坏了。我花了几个小时的时间向我们解释一下这样一种管理方式,即一台与其通信的设备与一台焊接在PCB上的FTDI芯片配对的Windows计算机很难通过用户友好性,无论多么光滑一个USB插座可能看起来像在柜子上......(值得庆幸的是,所有这些条件汇集在一起​​是非常罕见和不寻常的)

答案 6 :(得分:1)

自2010年以来,我遇到了这个问题,连接到电脑的串行标尺头。 usb到串口转换器..我使用onkly SILABS设备的CP2102等。我只是通过简单地允许驱动程序安装然后在设备管理器中寻找鼠标/ HIDA下的圆珠笔驱动器然后然后解决它只是禁用驱动程序,不要卸载它只是禁用它。然后当你重新启动时,即使驱动程序已经启动,它似乎会将comport忽略为串行鼠标并使用输入中的数据。您还会发现,如果圆珠笔驱动程序处于活动状态,那么COMport正在使用中,有时会返回一个无法访问的COM PORT ...希望这有助于那里的一些人:) Tx Ben

答案 7 :(得分:1)

在我的开发环境中,我只是从设备管理器中禁用了 Microsoft串行鼠标

这似乎解决了我的问题的罪魁祸首。在此之前,我在设计中使用的CH340G芯片用于在启动连接之前将DTR降低五次,从而有效地重新启动基于Arduino的电路板并使其无效。

Microsoft Serial Mouse Drivers Messing With Arduino Clone's CH340G UART to USB

答案 8 :(得分:0)

代码无法阻止GPS被检测为串行鼠标。

下面是C#.net中子例程的代码。它检查注册表项是否设置为4,如果不是,则发出配置命令以禁用Sermouse。 将此子例程嵌入在启动时运行的程序中,它将在Windows更新后更正设置。

如果您一次又一次地烦恼该问题可能会有用

私人无效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");
                    }
                }
            }
        }           
    }