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

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

  System.IO.IOException:存在不足的系统资源来完成所请求的服务。
在System.IO.Ports.InternalResources.WinIOError(Int32 errorCode,String str)
 at System.IO.Ports.SerialStream..ctor(String portName,Int32 baudRate,奇偶校验,Int32 dataBits,StopBits stopBits,Int32 readTimeout,Int32 writeTimeout,握手握手,Boolean dtrEnable,Boolean rtsEnable,Boolean discardNull,Byte parityReplace)
在System.IO.Ports.SerialPort.Open()

基于exception,会认为服务器资源不足,但似乎并非如此。 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 } } 

任何帮助,将不胜感激。

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

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

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

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

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

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

从中恢复:

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