Frage

Ich habe eine Anwendung, bei der seriellen I / O mit einem angeschlossenen USB-Gerät über einen virtuellen COM-Port durchgeführt wird. Wenn plötzliches Entfernen des Gerätes erkannt wird, was wäre der beste Weg, um das serielle I / O zu stoppen. Soll ich einfach den Port schließen? Oder sollte es eine globale Variable sein, die beibehalten wird, um das Vorhandensein der Vorrichtung anzuzeigen, die in jeder seriellen I / O-Funktion vor dem Versuch zur Übertragung geprüft werden sollen / Empfangen von Daten? Oder sollte es sich um eine Kombination der beiden, oder etwas anderes sein? Danke.

War es hilfreich?

Lösung

Ich nehme an, Sie Windows ausgeführt werden. Dies hängt davon ab, wie Sie Ihren Kommunikationsfluss entworfen haben.

Ich habe eine Basisport Objekt, in dem ich ein COMPort Objekt abgeleitet haben (und viele andere Kommunikationsobjekte). Das COMPort Objekt erstellt eine TXThread und RXThread Klasse. Diese Fäden werden für die „überlappt“ auf Signal warten, dass die Lese- oder Schreiboperation mit WaitForMultipleObjects() abgeschlossen.

Die TXThreads schlafen gehen, wenn es nichts zu tun ist, und weckt durch die TXWrite Funktion nach oben (die Daten zwischen Hauptprozess und Faden geht durch einen trhead sicheren FIFO-Puffer).

In diesem Fall müssen sie auch für ein Ereignissignal warten, dass der Port geschlossen hat, so dass sie tatsächlich alle anstehenden Vorgänge und Ausfahrt widerrufen kann (die Stufen Ausgänge und wird gelöscht).

Um festzustellen, ob der USB-Anschluss ist connectd / disconneted Ich höre für die Windows-Nachricht DEVICE_CHANGE. Wenn der Port getrennt habe ich die Veranstaltung und wartet auf die Fäden zu verlassen, bevor die Klasse Löschungen Hafen und schließt den Hafen.

Ich habe diese Vorgehensweise sehr zuverlässig und sicher gefunden. Es ist der Kern in einer I Kommunikationsplattform für mehr als 8 Jahre entworfen und noch treten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top