2013-02-19 23 views
5

Ho un servizio .NET 4 Windows che ho scritto che periodicamente (solitamente una volta al giorno) comunica con un dispositivo esterno su una porta seriale. Nel complesso il servizio di grandi opere, ma per un cliente, ogni tanto, una chiamata a SerialPort.Open() tiri la seguente eccezione:SerialPort.Open() genera IOException - Esistono risorse di sistema insufficienti per completare il servizio richiesto

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() 

Sulla base di eccezione, sarebbe portati a pensare che il server sta esaurendo le risorse , ma non sembra essere il caso. La CPU è più o meno inattiva e c'è un sacco di memoria e disco.

Ci sono molte menzioni online di SerialPort.Open() che lanciano altre IOException e ho implementato Zach Saw's SerialPortFixer, ma sembra che risolva un altro problema.

Ecco un esempio di ciò che sto facendo (notevolmente semplificato). Un paio di istanze di questa classe (usando diversi nomi di porta seriale) sono sempre in memoria e quindi il metodo Run() viene chiamato approssimativamente una volta al giorno per ogni istanza.

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 
    } 
} 

Qualsiasi aiuto sarebbe apprezzato.

+0

Questo errore deriva dal driver di periferica. Dì al cliente di buttare via l'emulatore USB che ha ora e prenderne un altro da un altro produttore. –

+0

Infatti, stanno utilizzando uno di [questi] (http://www.moxa.com/product/nport_5110.htm) e dovrebbero essere i migliori. –

risposta

2

La risposta a questa domanda è che il server della porta seriale utilizzato dal client era una versione wi-fi (Moxa NPort W2150 Plus) e si verifica un'eccezione quando il server della porta seriale presenta problemi di connettività wi-fi.

0

Ha avuto lo stesso problema con NPort 5150. L'aumento del timeout di rete (in NPort Administrator) ha risolto il problema.

0

Recentemente ho avuto lo stesso problema, la risoluzione per me era che stavo accidentalmente usando un cavo DB9 diretto con un dispositivo che richiedeva un cavo DB9 null modem. Una volta effettuato il passaggio a un cavo null modem, l'errore è scomparso e il dispositivo ha funzionato correttamente.

Quando ho chiamato Moxa, hanno suggerito alcune altre cose da provare che potrebbero portare a questo problema:

    software
  • anti-virus potrebbe interferire con la comunicazione
  • provare a utilizzare il programma di utilità Gestione driver piuttosto che Nport amministratore durante la configurazione delle porte COM (su macchine Windows)
0

ho avuto questo errore e il mio problema era che l'Amministrazione NPort trovato e programmato le porte seriali ma l'indirizzo IP4 della scheda di rete è stato impostato su DHCP. Penso che questo sia successo durante un aggiornamento del sistema.

Recupero da quella:

  1. aggiungere un indirizzo TCP/IP nella sottorete dell'interfaccia di rete
  2. Riassegnare le porte seriali in NPort Amministrazione
Problemi correlati