14 votes

utilisant un port COM - Fermer après chaque utilisation, ou laisser toujours ouvert ?

Jusqu'à présent, j'ouvrais quand j'avais besoin d'envoyer des données, et je fermais tout de suite. J'obtiens des erreurs aléatoires "Accès au port" (bien que je ferme toujours le port après l'avoir utilisé), donc je pensais peut-être le laisser toujours ouvert.

Quelle est la bonne approche d'utilisation, en supposant que toutes les minutes ou deux j'ai besoin d'envoyer des données dans certains ports COM ?

Merci..

11voto

Hans Passant Points 475940

Appeler fréquemment SerialPort.Close() est une erreur. Il n'est pas vraiment souhaitable qu'une autre application vous vole le port. Mais le plus problématique, et le problème que vous rencontrez, est que Close() n'attend pas que le thread de travail lancé par SerialPort se termine. Ce worker thread lève les événements DataReceived, PinChanged et ErrorReceived. Il faut "un certain temps" pour qu'il se termine, entre quelques millisecondes et quelques secondes. Appeler Open() à nouveau échouera jusqu'à ce que cela soit fait.

Il s'agit d'un défaut dans la classe, mais induit par l'usage courant des ports série. Les applications ne les ferment normalement pas avant que l'application ne se termine. Y compris jamais, ce qui permet d'éviter un scénario de blocage courant. Notez que la classe Article de MSDN pour Close met en garde à ce sujet :

La meilleure pratique pour toute application est d'attendre un certain temps après l'appel de la méthode Close avant d'essayer d'appeler la méthode Open, car le port peut ne pas être fermé instantanément.

2voto

shawty Points 2429

Si vous vous inquiétez de l'ouverture/fermeture et du fait que d'autres applications volent le port COM, vous pouvez utiliser l'approche utilisée par Microsoft pour le pilote intermédiaire GPS dans Windows embedded, c'est-à-dire écrire un agrégateur, qui ouvre le port, le maintient ouvert, puis fournit des points de connexion pour que d'autres applications puissent s'y connecter.

La manière dont vous créez les connexions dépend de vous : vous pouvez vous plonger dans le matériel et écrire un pilote de port de communication virtuel qui peut être partagé, ou vous pouvez faire ce que j'ai fait et écrire un simple service de socket win32 qui permet aux programmes clients de se connecter par le biais de connexions de socket Windows normales.

La réponse n'est peut-être pas directe, mais elle donne matière à réflexion.

1voto

Tralli Points 283

Il n'y a que très peu d'inconvénients à laisser un port série ouvert, alors oui, laissez-le ouvert. Cela vous évite d'avoir à l'ouvrir ou à le fermer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X