在 Windows 10 上管理串行端口时遇到问题。
我需要将串行设备插入计算机,大多数时候它工作正常,但在某些情况下端口停止工作,即使任何进程正在使用它也拒绝任何新连接,设备管理器显示端口正在运行可用(驱动程序已加载)。
有时,串行端口可用,直到我在 Windows DeviceManager 中禁用设备中的端口,重新启动计算机并再次启用它。 知道我尝试过使用一些 Microsoft 工具:
现在我正在考虑一些与硬件相关的问题,串口连接为NullModém,这意味着仅连接GND、Tx和Rx。这样接线方式不行吗 RS232下不会有什么总线逻辑问题吧?
可能是驱动程序与主板串口不兼容?
还有其他我可以尝试的想法吗?
编辑: 欠压/过压可能会阻塞串行端口?
我解决了这个问题。
事实证明,如果 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 注册表,有一个简单(且临时)的解决方案。 让我们回顾一下:错误来自于端口的识别(枚举),当数据进入端口时,因此,如果您可以在枚举时避免数据流动,那么您就明白了。