SerialPort.Open()抛出IOException - 没有足够的系统资源来完成所请求的服务

时间:2013-02-19 15:37:33

标签: c# .net serial-port ioexception

我有一个.NET 4 Windows服务,我写的是定期(通常每天一次)通过串口与外部设备通信。总而言之,这项服务非常有效,但是对于一个客户,不时地调用SerialPort.Open()会引发以下异常:

System.IO.IOException: Insufficient system resources exist to complete the requested service.
at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
at System.IO.Ports.SerialPort.Open()

基于异常,会认为服务器资源不足,但似乎并非如此。 CPU或多或少是空闲的,并且有足够的内存和磁盘。

网上有很多提及SerialPort.Open()抛出其他IOExceptions的内容,我已经实现了Zach Saw's 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
    }
}

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:2)

这个问题的答案是客户端使用的串口服务器是wi-fi版本(Moxa NPort W2150 Plus),结果发现当串口服务器出现Wi-Fi连接问题时会发生异常。 / p>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我最近遇到了同样的问题,我的解决方案是我不小心使用直通DB9电缆和需要零调制解调器DB9电缆的设备。一旦我换成零调制解调器电缆,错误消失,设备正常运行。

当我打电话给Moxa时,他们提出了一些其他可能会导致此问题的事情:

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

答案 3 :(得分:0)

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

从中恢复:

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