Question

I ai une application dans laquelle E / S série est réalisée avec un dispositif USB connecté via un port de communication virtuel. Lorsque le retrait surprise de l'appareil est détecté, quelle serait la meilleure façon d'arrêter la série E / S. Dois-je tout simplement fermer le port? Ou, devrait-il y avoir une variable globale, qui est maintenue pour indiquer la présence du dispositif, qui doit être vérifié dans chaque fonction E / S série avant de tenter d'émission / réception de données? Ou, devrait-il être une combinaison des deux, ou autre chose? Merci.

Était-ce utile?

La solution

Je suppose que vous utilisez 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 tiré un objet comportons (et bien d'autres objets de communication). L'objet comportons crée une classe TXThread et RXThread. Ces fils sont en attente pour le « chevauchement » pour signaler que l'opération de lecture ou d'écriture terminée avec WaitForMultipleObjects().

Les TXThreads va dormir s'il n'y a rien à faire et se réveille par la fonction TXWrite (les données entre processus principal et le fil passe par un trhead tampon FIFO sûre).

Dans ce cas, ils ont aussi besoin d'attendre un signal d'événement que le port est fermé, de sorte qu'ils peuvent réellement annuler toutes les opérations en cours et de sortie (les sorties de bandes de roulement et est supprimé).

Pour détecter si le port USB est connectd / disconneted J'écoute le message Windows DEVICE_CHANGE. Si le port est déconnecté je mis l'événement et attend les fils de sortie avant la classe supprime Port et ferme le port.

J'ai trouvé cette approche très fiable et sûr. Il est le noyau dans une plate-forme de communication I conçu pour il y a plus de 8 ans et toujours coups de pied.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top