SerialPort.Open()引发IOException-系统资源不足,无法完成请求的服务

本文关键字:请求 服务 Open 引发 IOException- 系统资源 SerialPort | 更新日期: 2023-09-27 18:00:03

我编写了一个.NET 4 Windows服务,它定期(通常每天一次)通过串行端口与外部设备通信。总的来说,该服务运行良好,但对于一个客户来说,不时调用SerialPort.Open()会引发以下异常:

System.IO.IOException:系统资源不足,无法完成请求的服务。位于System.IO.Ports.InternalResources.WinIOError(Int32错误代码,字符串str)在System.IO.Ports.SerialStream.ctor(字符串portName,Int32 baudRate,奇偶校验,Int32 dataBits,StopBits StopBits,Int32 readTimeout,Int32 writeTimeout,握手握手,布尔dtrEnable,布尔rtsEnable,布尔discardNull,字节parityReplace)位于System.IO.Ports.SerialPort.Open()

根据异常情况,可能会认为服务器资源不足,但事实并非如此。CPU或多或少是空闲的,并且有足够的内存和磁盘。

网上有很多提到SerialPort.Open()抛出其他IOExceptions,我已经实现了Zach Saw的SerialPortFixer,但它似乎解决了一个不同的问题。

下面是我正在做的一个例子(大大简化了)。这个类的几个实例(使用不同的串行端口名)一直在内存中,然后大约每天为每个实例调用Run()方法一次。

public class Collector
{
    private SerialPort _port;
    private string _portName;
    public void Run()
    {
        try
        {
            // Run Zach Saw's IOException workaround
            SerialPortFixer.Execute(_portName);
            using (_port = new SerialPort(_portName, 9600, Parity.None, 8, StopBits.One))
            {
                _port.DataReceived += PortDataReceived;
                _port.ErrorReceived += PortErrorReceived;
                _port.Handshake = Handshake.None;
                _port.DtrEnable = true;
                _port.RtsEnable = true;
                _port.Open();
                // Do the stuff
                _port.Close();
            }
        }
        catch (Exception e)
        {
            // Handle exception
        }
    }
    private void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // Do other stuff
    }
    private void PortErrorReceived(object sender, SerialErrorReceivedEventArgs e)
    {
        // Log error
    }
}

如有任何帮助,我们将不胜感激。

SerialPort.Open()引发IOException-系统资源不足,无法完成请求的服务

这个问题的答案是,客户端使用的串行端口服务器是wi-fi版本(Moxa NPort W2150 Plus),事实证明,当串行端口服务器存在wi-fi连接问题时,会发生异常。

NPort 5150也有同样的问题。增加网络超时(在NPort Administrator中)解决了我的问题。

我最近遇到了同样的问题,对我来说,解决方案是我意外地使用了一根直通DB9电缆,而设备需要一根零调制解调器DB9电缆。一旦我换上了零调制解调器电缆,错误就消失了,设备也正常工作。

当我打电话给Moxa时,他们建议尝试其他可能导致这个问题的方法:

  • 防病毒软件可能会干扰通信
  • 设置COM端口(在Windows计算机上)时,请尝试使用驱动程序管理器实用程序,而不是Nport Administrator

我遇到了这个错误,我的问题是NPort Administration找到并编程了串行端口,但网卡的IP4地址设置为DHCP。我认为这是在系统更新期间发生的。

从中恢复:

  1. 在网络接口的子网中添加TCP/IP地址
  2. 在NPort Administration中重新分配串行端口