SerialPort et .NET 4.0
Salut,
Au travail, je me suis confronté à la classe SerialPort du framework .NET. Et le moins qu'on puisse dire, c'est que pas mal de monde a des soucis avec et que Microsoft n'a pas résolu tous les bugs. Et certains peuvent être gênant.
Celui auquel j'ai été confronté m'a pas mal retourné la tête et concerne un périphérique USB qui émule un port COM. Le port s'ouvrait bien, lecture, écriture, fermeture. Tout était OK, seulement si le périphérique se coupait (débranchement, etc.) puis était reconnecté, apparaissait dans Windows, l'ouverture du port me balançait cette erreur :
Paramètres invalides ...
Après un certain temps (aléatoire) cependant il redevenait possible d'ouvrir le port avec les mêmes paramètres qu'avant.
Paramètres invalides ...
Après un certain temps (aléatoire) cependant il redevenait possible d'ouvrir le port avec les mêmes paramètres qu'avant.
Ça en général c'est génial ... Et rien à y faire, mon seul moyen de communiquer avec le périphérique lorsqu'il rentrait dans cet état était de taper dedans avec l'API bas niveau en lisant dans le port comme dans un fichier ...
Pour palier à ça, j'ai un peu épluché le Web, j'ai soupçonné pas mal de trucs (dont le driver ...) et mes doutes étaient bons. La classe SerialPort ne ferme pas toujours très bien le BaseStream qu'elle créé lors de l'ouverture du port. L'objet doit rester dans un certain état dans un thread de l'OS et se détruire automatiquement après un certain temps. Ce qui explique le caractère aléatoire de l'erreur.
Sans plus attendre, voilà la façon qui m'a permis de fermer le port correctement et de le rendre à nouveau frais et dispo directement après :
// Where Serial is a SeriaPort Object public void Close(){ try{GC.SuppressFinalize(Serial.BaseStream);} catch{} // I use a second try/catch because you HAVE to close SerialPort even if you weren't able to suppress it's baseStream try{Serial.Close();} catch{} Serial = null; }
Voilà maintenant votre liaison série sera opérationnelle après appel de la methode Close.
Dire que j'ai faillis tout recoder avec du readFile ...
Dire que j'ai faillis tout recoder avec du readFile ...
Commentaires
Enregistrer un commentaire