J'ai une application dans laquelle des E/S série sont effectuées avec un périphérique USB connecté via un port COM virtuel. Lorsque la suppression surprise du périphérique est détectée, quel serait le meilleur moyen d'arrêter les E/S série. Devrais-je simplement fermer le port? Ou, en cas de présence d'une variable globale, conservée pour indiquer la présence du périphérique, doit-elle être vérifiée dans chaque fonction d'E/S série avant d'essayer de transmettre/recevoir des données? Ou, devrait-il être une combinaison des deux, ou quelque chose d'autre? Merci.Interruption d'E/S série par programmation lors de la suppression d'un périphérique USB - C++
Répondre
Je suppose que vous exécutez Windows. Cela dépend de la façon dont vous avez conçu votre flux de communication.
J'ai un objet BasePort où j'ai dérivé un objet COMPort (et de nombreux autres objets de communication). L'objet COMPort crée une classe TXThread et RXThread. Ces threads attendent que "OVERLAP" indique que l'opération de lecture ou d'écriture s'est terminée avec WaitForMultipleObjects()
. Le TXThreads se met en veille s'il n'y a rien à faire et à réveiller par la fonction TXWrite (les données entre le processus principal et le thread passent par un tampon FIFO de sécurité tread).
Dans ce cas, ils doivent également attendre un signal d'événement que le port a fermé, afin qu'ils puissent effectivement annuler toutes les opérations en attente et quitter (les bandes de roulement se termine et est supprimé).
Pour détecter si le port USB est connecté/déconnecté, j'écoute le message Windows DEVICE_CHANGE
. Si le port est déconnecté, je définis l'événement et attend que les threads se terminent avant que la classe Port supprime et ferme le port. J'ai trouvé cette approche très fiable et sûre. C'est le noyau d'une plate-forme de communication que j'ai conçue il y a plus de 8 ans et qui continue de donner des coups de pied.
Je pense que cela fonctionne. Merci. –