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
}
}
如有任何帮助,我们将不胜感激。
这个问题的答案是,客户端使用的串行端口服务器是wi-fi版本(Moxa NPort W2150 Plus),事实证明,当串行端口服务器存在wi-fi连接问题时,会发生异常。
NPort 5150也有同样的问题。增加网络超时(在NPort Administrator中)解决了我的问题。
我最近遇到了同样的问题,对我来说,解决方案是我意外地使用了一根直通DB9电缆,而设备需要一根零调制解调器DB9电缆。一旦我换上了零调制解调器电缆,错误就消失了,设备也正常工作。
当我打电话给Moxa时,他们建议尝试其他可能导致这个问题的方法:
- 防病毒软件可能会干扰通信
- 设置COM端口(在Windows计算机上)时,请尝试使用驱动程序管理器实用程序,而不是Nport Administrator
我遇到了这个错误,我的问题是NPort Administration找到并编程了串行端口,但网卡的IP4地址设置为DHCP。我认为这是在系统更新期间发生的。
从中恢复:
- 在网络接口的子网中添加TCP/IP地址
- 在NPort Administration中重新分配串行端口