串口被无进程阻塞

问题描述 投票:0回答:2

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

我需要将串行设备插入计算机,大多数时候它工作正常,但在某些情况下端口停止工作,即使任何进程正在使用它也拒绝任何新连接,设备管理器显示端口正在运行可用(驱动程序已加载)。

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

  • PnPUtil,创建双击 PowerShell 脚本来禁用和启用设备。它不起作用,我不得不拔掉并插入物理串行设备。根据定义,它适用于即插即用设备。
  • DevCon,它与 PnPUtil 类似,但它指定适用于插入计算机的任何设备。我制作了类似的脚本,但得到了相同的结果。
  • Handle,我发现了句柄的存在,它们就像链接到一个进程的依赖项,包括一个设备实例(使用驱动程序文件)。当我得到未使用的端口时,我尝试搜索 SerialPort 的句柄(“Device/Serial0”),但没有进程正在使用它。 它已被检测到但以某种方式被阻止。
  • ProcessExplorer,这个工具就像TaskManager,但为您提供每个进程的详细视图,包括句柄。 我再次确认,端口没有被使用。

现在我正在考虑一些与硬件相关的问题,串口连接为NullModém,这意味着仅连接GND、Tx和Rx。这样接线方式不行吗 RS232下不会有什么总线逻辑问题吧?

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

还有其他我可以尝试的想法吗?

编辑: 欠压/过压可能会阻塞串行端口?

.net windows-10 serial-port sysinternals
2个回答
3
投票

我解决了这个问题。

事实证明,如果 Windows 在串行端口枚举启动时(系统启动或启用/加载新设备时)检测到持续的数据流,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 重新启动或禁用/启用或删除设备),则端口会被阻止Windows 创建一个新设备,一个控制 COM 端口的串行鼠标:

Windows 设备管理器中的串行鼠标屏幕截图

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

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

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sermouse

Start

键中的值3替换为4。 (3 为默认,4 为禁用)。 如果您无法访问 Windows 注册表,有一个简单(且临时)的解决方案。 让我们回顾一下:错误来自于端口的识别(枚举),当数据进入端口时,因此,如果您可以在枚举时避免数据流动,那么您就明白了。

    打开电脑前拔下端口,Windows 启动后即可插入。
  1. 如果您可以操纵串行设备停止工作(实际上是停止发送数据),例如将其关闭,或以某种方式暂停设备,那么您可以启动 Windows,然后恢复设备工作。
  2. 如果您可以访问 Windows 设备管理器,则可以通过禁用/启用 COM 端口而不是重新启动 Window 来应用第二点。
  3. 您还可以禁用 COM 端口,将其拔出,然后再次启用(SerialMouse 将被删除)并插入。
  4. 获得这些解决方案花了我一个多星期的时间。我希望它对其他人有用。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.