串行端口被 none 进程阻塞

Serial port blocked by none process

管理 Windows 10 上的串行端口时遇到问题。

我需要在电脑上插入一个串口设备,大多数情况下它工作正常,但在某些情况下端口停止工作,即使有任何进程正在使用它也只是拒绝任何新连接,设备管理器显示端口可用(驱动程序已加载)。

有时 SerialPort 可用,直到我在 Windows DeviceManager 中禁用设备中的端口,重新启动计算机并再次启用它。 知道我已经尝试使用一些 Microsoft 工具:

现在我在考虑一些与硬件相关的问题,串口连接为NullModém,这意味着只连接了GND、Tx 和Rx。所以那种接线方式,不能有 是RS232下的业务逻辑问题吧?

可能是驱动与主板串口不兼容?

有没有其他人可以尝试的其他想法?

编辑: under/overvoltage 可能会阻塞串行端口?

我有点解决了问题。

事实证明,如果Windows在串口enumarion启动时(系统启动或当你enable/load一个新设备时)检测到持续的数据流,Windows识别串口COM 作为串行鼠标,创建一个链接到该串行端口的新设备。因此该端口将无法用于任何其他进程。

我在阅读这篇参考文献时发现了问题(包括一个类似的问题):

我想提供更多关于我所做的事情的细节。

我制作了一个 C# ConsoleApp,它通过使用连接到另一台具有传统串行端口的 PC 的 USB-RS232 适配器不断地将数据发送到端口。 这是应用程序的代码:

class SerialPortConnection : IDisposable
{
    SerialPort _serialPort;
    public void Start()
    {
        _serialPort = new SerialPort();
        _serialPort.BaudRate = 9600;
        _serialPort.Parity = Parity.None;
        _serialPort.StopBits = StopBits.One;
        _serialPort.Handshake = Handshake.None;
        _serialPort.PortName = "COM5";

        _serialPort.ReadTimeout = 500;
        _serialPort.WriteTimeout = 100;

        this._serialPort.Open();
        int i = 10 * 60 * 1000;//120 segundos

        while (i > 0)
        {
            this._serialPort.Write("ZABCDEFGHIJKLNOPQRSTUG");//22 bytes ->22 x 4(250ms) = 88 bytes/s -> con baudrate 9600
            
            
            System.Threading.Thread.Sleep(250);                                            
        
        }
        
    }
    public void Dispose()
    {
        this._serialPort.Close();
    }
}

我尝试了几个字节,最后我意识到如果应用程序使用 9600 波特率每 250 毫秒发送恰好或超过 22 个字节并强制枚举(windows 重启或 disabling/enabling或删除设备),端口被阻止并且 Windows 创建一个新设备,一个控制 COM 端口的串行鼠标:

Screenshot Serial Mouse in Windows Device Manager

这就是端口拒绝任何新连接的原因。 为了避免它,你只需要禁用串行鼠标(而不是卸载,因为在将来重新启动时,windows 可能会再次加载它)。

您也可以修改Windows注册表来避免服务启动:

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sermouse

正在将键 Start 中的值 3 替换为 4。 (3 是默认值,4 是禁用的)。

如果您无法访问 Windows 注册表,有一个简单的(临时的)解决方案。 回顾一下:错误来自端口的识别(枚举),当数据进入端口时,所以,如果你能在枚举的那一刻避免数据流动,那么你就明白了。

  1. 开机前拔掉端口,Windows一启动就可以插上

  2. 如果您可以操纵串行设备停止工作(实际上是停止发送数据),例如将其关闭或以某种方式暂停设备,那么您可以启动 Windows 和然后恢复设备工作。

  3. 如果您可以访问 Windows 设备管理器,您可以通过 disabling/enabling COM 端口应用第二点,而不是重新启动 Window。

  4. 您也可以禁用COM端口,拔掉它,然后重新启用(SerialMouse会被移除)再插上。

获得这些解决方案花了我一个多星期的时间。我希望它对其他人有用。