Mam usługę .NET 4 Windows, którą napisałem, że okresowo (zazwyczaj raz dziennie) komunikuję się z urządzeniem zewnętrznym przez port szeregowy. W sumie służbie działa świetnie, ale dla jednego klienta, co jakiś czas, to wezwanie do SerialPort.Open()
rzuca następujący wyjątek:SerialPort.Open() wyrzuca wyjątek IOException - Brak wystarczających zasobów systemowych do wykonania żądanej usługi
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()
podstawie wyjątku, to pomyśli, że serwer jest brakować zasobów , ale tak się nie wydaje. Procesor jest mniej lub bardziej bezczynny i jest dużo pamięci i dysku.
Istnieje wiele wzmianek online o SerialPort.Open()
rzucających inne błędy IOExceptions i zaimplementowałem Zach Saw's SerialPortFixer, ale wydaje się, że rozwiązuje inny problem.
Oto przykład tego, co robię (znacznie uproszczony). Kilka wystąpień tej klasy (używając różnych nazw portów szeregowych) jest w pamięci przez cały czas, a następnie metoda Run() jest wywoływana mniej więcej raz dziennie dla każdej instancji.
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
}
}
Każda pomoc zostanie doceniona.
ten błąd pochodzi od sterownika. Powiedz klientowi, żeby wyrzucił emulator USB, który ma teraz, i kup inny od innego producenta. –
W rzeczywistości używają jednego z nich (http://www.moxa.com/product/nport_5110.htm) i powinny być najlepsze. –