2010-12-02 8 views
0

Ich habe eine Anwendung, bei der serielle E/A mit einem angeschlossenen USB-Gerät über einen virtuellen COM-Port durchgeführt wird. Wenn die überraschende Entfernung des Geräts erkannt wird, was wäre der beste Weg, die serielle E/A zu stoppen. Soll ich den Hafen einfach schließen? Oder sollte es eine globale Variable geben, die das Vorhandensein des Geräts anzeigt, die in jeder seriellen E/A-Funktion überprüft werden sollte, bevor versucht wird, Daten zu senden/zu empfangen? Oder sollte es eine Kombination der beiden oder etwas anderes sein? Vielen Dank.Programmatische Unterbrechung der seriellen E/A beim Entfernen des USB-Geräts - C++

Antwort

1

Ich gehe davon aus, dass Sie Windows ausführen. Dies hängt davon ab, wie Sie Ihren Kommunikationsfluss gestaltet haben.

Ich habe ein BasePort-Objekt, wo ich ein COMPort-Objekt (und viele andere Kommunikationsobjekte) abgeleitet habe. Das COMPort-Objekt erstellt eine TXThread- und eine RXThread-Klasse. Diese Threads warten darauf, dass "OVERLAP" signalisiert, dass die Lese- oder Schreiboperation mit WaitForMultipleObjects() beendet wurde.

Die TXThreads gehen in den Ruhezustand, wenn es nichts zu tun gibt und wacht durch die TXWrite-Funktion auf (die Daten zwischen Hauptprozess und Thread laufen durch einen trhead-sicheren FIFO-Puffer).

In diesem Fall müssen sie auch auf ein Ereignissignal warten, dass der Port geschlossen wurde, so dass sie alle ausstehenden Operationen abbrechen und beenden können (die Stufen treten aus und werden gelöscht).

Um festzustellen, ob der USB-Port verbunden/getrennt ist, höre ich die Windows-Nachricht DEVICE_CHANGE. Wenn der Port nicht verbunden ist, lege ich das Ereignis fest und warte darauf, dass die Threads beendet werden, bevor die Port-Klasse den Port löscht und schließt.

Ich habe diesen Ansatz sehr zuverlässig und sicher gefunden. Es ist der Kern einer Kommunikationsplattform, die ich vor über 8 Jahren entwickelt habe und die immer noch auf dem Vormarsch ist.

+0

Ich denke, ich habe das funktioniert. Vielen Dank. –