SerialPort.Open () lève IOException – Il existe des ressources système insuffisantes pour terminer le service demandé

J’ai un service Windows .NET 4 que j’ai écrit et qui écrit régulièrement (généralement une fois par jour) avec un périphérique externe via un port série. Dans l’ensemble, le service fonctionne à SerialPort.Open() , mais pour un client, de temps en temps, un appel à SerialPort.Open() lève l’exception suivante:

  System.IO.IOException: il existe des ressources système insuffisantes pour terminer le service demandé.
 sur System.IO.Ports.InternalResources.WinIOError (Int32 errorCode, Ssortingng str)
 at System.IO.Ports.SerialStream..ctor (Ssortingng portName, Int32 baudRate, Parité de parité, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, poignée de main, Boolean dtrEnable, Boolean rtsEnable, Boolean rtsEnable, Boolean
 à System.IO.Ports.SerialPort.Open ()

Si l’on se base sur cette exception, on pourrait penser que le serveur manque de ressources, mais cela ne semble pas être le cas. Le processeur est plus ou moins inactif et il y a beaucoup de mémoire et de disque.

Il y a beaucoup de mentions en ligne de SerialPort.Open() lançant d’autres IOExceptions et j’ai implémenté SerialPortFixer de Zach Saw , mais il semble que cela corrige un problème différent.

Voici un exemple de ce que je fais (grandement simplifié). Quelques instances de cette classe (utilisant différents noms de port série) sont en mémoire à tout moment, puis la méthode Run () est appelée environ une fois par jour pour chaque instance.

 public class Collector { private SerialPort _port; private ssortingng _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 } } 

Toute aide serait appréciée.

La réponse à cette question est que le serveur de port série utilisé par le client était une version Wi-Fi (Moxa NPort W2150 Plus) et qu’une exception se produit lorsque le serveur de port série a des problèmes de connectivité Wi-Fi.

J’ai eu le même problème avec NPort 5150. L’augmentation du délai d’attente du réseau (dans NPort Administrator) a résolu mon problème.

J’ai récemment eu le même problème, la solution pour moi était que j’utilisais accidentellement un câble DB9 direct avec un périphérique nécessitant un câble DB9 null modem. Une fois que j’ai permuté sur un câble null modem, l’erreur a disparu et le périphérique a fonctionné correctement.

Lorsque j’ai appelé Moxa, ils ont suggéré d’autres solutions susceptibles de provoquer ce problème:

  • Un logiciel anti-virus pourrait interférer avec la communication
  • Essayez d’utiliser l’utilitaire de gestionnaire de pilotes plutôt que l’Administrateur de Nport lors de la configuration des ports COM (sur des machines Windows).

J’ai eu cette erreur et mon problème était que l’administration NPort avait trouvé et programmé les ports série mais que l’adresse IP4 de la carte réseau était configurée sur DHCP. Je pense que cela s’est produit lors d’une mise à jour du système.

Récupération de cela:

  1. Ajouter une adresse TCP / IP dans le sous-réseau de l’interface réseau
  2. Réaffecter les ports série dans l’administration NPort