5

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

System.IO.IOException:系统资源不足,无法完成请求的服务。
在 System.IO.Ports.InternalResources.WinIOError(Int32 错误代码,字符串 str)
在 System.IO.Ports.SerialStream..ctor (字符串端口名,Int32 波特率,奇偶校验,Int32 数据位,StopBits stopBits,Int32 读取超时,Int32 写入超时,握手握手,布尔 dtrEnable,布尔 rtsEnable,布尔丢弃空,字节奇偶校验替换)
在 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
    }
}

任何帮助,将不胜感激。

4

4 回答 4

3

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

于 2013-06-28T08:36:55.453 回答
0

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

于 2015-01-30T10:20:52.047 回答
0

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

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

  • 防病毒软件可能会干扰通信
  • 在设置 COM 端口(在 Windows 机器上)时,尝试使用 Driver Manager Utility 而不是 Nport Administrator
于 2017-05-09T19:49:11.690 回答
0

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

从中恢复:

  1. 在网络接口的子网中添加 TCP/IP 地址
  2. 在 NPort 管理中重新分配串行端口
于 2017-07-20T10:02:20.930 回答