串行端口被 none 进程阻塞
Serial port blocked by none process
管理 Windows 10 上的串行端口时遇到问题。
我需要在电脑上插入一个串口设备,大多数情况下它工作正常,但在某些情况下端口停止工作,即使有任何进程正在使用它也只是拒绝任何新连接,设备管理器显示端口可用(驱动程序已加载)。
有时 SerialPort 可用,直到我在 Windows DeviceManager 中禁用设备中的端口,重新启动计算机并再次启用它。
知道我已经尝试使用一些 Microsoft 工具:
- PnPUtil,创建双击 PowerShell 脚本以禁用和启用设备。它没有用,我不得不拔下并实际插入串行设备。根据定义,它适用于即插即用设备。
- DevCon,它与 PnPUtil 类似,但它指定适用于插入计算机的任何设备。我做了一个类似的脚本,但得到了相同的结果。
- Handle,我发现句柄的存在,它们就像链接到进程的依赖项,包括设备实例(使用驱动程序文件)。当我得到未使用的端口时,我尝试搜索 SerialPort ("Device/Serial0") 的句柄,并且 none 进程正在使用它。
它已被检测到但以某种方式被阻止。
- ProcessExplorer,此工具类似于 TaskManager,但可以为您提供每个进程的详细视图,包括句柄。
我再次确认,端口没有被使用
现在我在考虑一些与硬件相关的问题,串口连接为NullModém,这意味着只连接了GND、Tx 和Rx。所以那种接线方式,不能有
是RS232下的业务逻辑问题吧?
可能是驱动与主板串口不兼容?
有没有其他人可以尝试的其他想法?
编辑:
under/overvoltage 可能会阻塞串行端口?
我有点解决了问题。
事实证明,如果Windows在串口enumarion启动时(系统启动或当你enable/load一个新设备时)检测到持续的数据流,Windows识别串口COM 作为串行鼠标,创建一个链接到该串行端口的新设备。因此该端口将无法用于任何其他进程。
我在阅读这篇参考文献时发现了问题(包括一个类似的问题):
- RS232 COM port blocked after Windows restart
- Force a COM port to close - Stack Overflow
- 如何在VAIO电脑上使用标准串口鼠标? |索尼
在
- My Computer thinks the GPS unit is a mouse
我想提供更多关于我所做的事情的细节。
我制作了一个 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 注册表,有一个简单的(临时的)解决方案。
回顾一下:错误来自端口的识别(枚举),当数据进入端口时,所以,如果你能在枚举的那一刻避免数据流动,那么你就明白了。
开机前拔掉端口,Windows一启动就可以插上
如果您可以操纵串行设备停止工作(实际上是停止发送数据),例如将其关闭或以某种方式暂停设备,那么您可以启动 Windows 和然后恢复设备工作。
如果您可以访问 Windows 设备管理器,您可以通过 disabling/enabling COM 端口应用第二点,而不是重新启动 Window。
您也可以禁用COM端口,拔掉它,然后重新启用(SerialMouse会被移除)再插上。
获得这些解决方案花了我一个多星期的时间。我希望它对其他人有用。
管理 Windows 10 上的串行端口时遇到问题。
我需要在电脑上插入一个串口设备,大多数情况下它工作正常,但在某些情况下端口停止工作,即使有任何进程正在使用它也只是拒绝任何新连接,设备管理器显示端口可用(驱动程序已加载)。
有时 SerialPort 可用,直到我在 Windows DeviceManager 中禁用设备中的端口,重新启动计算机并再次启用它。 知道我已经尝试使用一些 Microsoft 工具:
- PnPUtil,创建双击 PowerShell 脚本以禁用和启用设备。它没有用,我不得不拔下并实际插入串行设备。根据定义,它适用于即插即用设备。
- DevCon,它与 PnPUtil 类似,但它指定适用于插入计算机的任何设备。我做了一个类似的脚本,但得到了相同的结果。
- Handle,我发现句柄的存在,它们就像链接到进程的依赖项,包括设备实例(使用驱动程序文件)。当我得到未使用的端口时,我尝试搜索 SerialPort ("Device/Serial0") 的句柄,并且 none 进程正在使用它。 它已被检测到但以某种方式被阻止。
- ProcessExplorer,此工具类似于 TaskManager,但可以为您提供每个进程的详细视图,包括句柄。 我再次确认,端口没有被使用
现在我在考虑一些与硬件相关的问题,串口连接为NullModém,这意味着只连接了GND、Tx 和Rx。所以那种接线方式,不能有 是RS232下的业务逻辑问题吧?
可能是驱动与主板串口不兼容?
有没有其他人可以尝试的其他想法?
编辑: under/overvoltage 可能会阻塞串行端口?
我有点解决了问题。
事实证明,如果Windows在串口enumarion启动时(系统启动或当你enable/load一个新设备时)检测到持续的数据流,Windows识别串口COM 作为串行鼠标,创建一个链接到该串行端口的新设备。因此该端口将无法用于任何其他进程。
我在阅读这篇参考文献时发现了问题(包括一个类似的问题):
- RS232 COM port blocked after Windows restart
- Force a COM port to close - Stack Overflow
- 如何在VAIO电脑上使用标准串口鼠标? |索尼 在
- My Computer thinks the GPS unit is a mouse
我想提供更多关于我所做的事情的细节。
我制作了一个 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 注册表,有一个简单的(临时的)解决方案。 回顾一下:错误来自端口的识别(枚举),当数据进入端口时,所以,如果你能在枚举的那一刻避免数据流动,那么你就明白了。
开机前拔掉端口,Windows一启动就可以插上
如果您可以操纵串行设备停止工作(实际上是停止发送数据),例如将其关闭或以某种方式暂停设备,那么您可以启动 Windows 和然后恢复设备工作。
如果您可以访问 Windows 设备管理器,您可以通过 disabling/enabling COM 端口应用第二点,而不是重新启动 Window。
您也可以禁用COM端口,拔掉它,然后重新启用(SerialMouse会被移除)再插上。
获得这些解决方案花了我一个多星期的时间。我希望它对其他人有用。