2013-02-19 26 views
5

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.

+0

ten błąd pochodzi od sterownika. Powiedz klientowi, żeby wyrzucił emulator USB, który ma teraz, i kup inny od innego producenta. –

+0

W rzeczywistości używają jednego z nich (http://www.moxa.com/product/nport_5110.htm) i powinny być najlepsze. –

Odpowiedz

2

Odpowiedź na to pytanie jest taka, że ​​serwer portu szeregowego używany przez klienta był wersją Wi-Fi (Moxa NPort W2150 Plus) i okazuje się, że wyjątek występuje, gdy serwer portu szeregowego ma problemy z połączeniem Wi-Fi.

0

Miał ten sam problem z NPort 5150. Zwiększenie limitu czasu sieci (w NPort Administrator) rozwiązało mój problem.

0

Niedawno miałem ten sam problem, dla mnie rozdzielczość polegała na tym, że przypadkowo użyłem prostego kabla DB9 z urządzeniem, które wymagało kabla DB9 z modemem zerowym. Po zamianie na zerowy kabel modemowy błąd zniknął i urządzenie działało prawidłowo.

Gdy zadzwoniłem Moxa, zaproponowali kilka innych rzeczy, aby spróbować, które mogłyby doprowadzić do tego problemu:

    oprogramowanie
  • Anti-virus może być zakłócanie komunikacji
  • spróbuj użyć narzędzia Menedżer sterowników zamiast Nport Administrator podczas konfigurowania portów COM (na komputerach z systemem Windows)
0

Miałem ten błąd i moim problemem było to, że administracja NPort odnalazła i zaprogramowała porty szeregowe, ale adres IP4 karty sieciowej został ustawiony na DHCP. Myślę, że stało się to podczas aktualizacji systemu.

Poprawa że:

  1. Dodaj adres TCP/IP w podsieci interfejsu sieciowego
  2. ponownie przypisać porty szeregowe w NPort Administration