Programmazione di rottura I / O seriale quando il dispositivo USB viene rimosso - C ++
-
30-09-2019 - |
Domanda
Ho un'applicazione in cui seriale I / O viene condotta con un dispositivo USB collegato tramite una porta COM virtuale. Quando viene rilevato rimozione inattesa del dispositivo, quale sarebbe il modo migliore per fermare la seriale I / O. Dovrei semplicemente chiudere la porta? Oppure, dovrebbe esserci una variabile globale, che viene mantenuta per indicare la presenza del dispositivo, che deve essere controllato in ogni funzione seriale I / O prima di tentare di trasmissione / ricezione dati? Oppure, dovrebbe essere una combinazione dei due, o qualcos'altro? Grazie.
Soluzione
Sto assumendo si esegue Windows. Questo dipende da come è stato progettato il flusso di comunicazione.
Ho un oggetto baseport dove ho derivato un oggetto COMPort (e molti altri oggetti di comunicazione). L'oggetto COMPort crea una classe TXThread e RXThread. Questi fili sono in attesa della "OVERLAP" a segnale che l'operazione di lettura o scrittura finito con WaitForMultipleObjects()
.
I TXThreads va a dormire se non c'è niente da fare e si sveglia dalla funzione TXWrite (i dati tra processo principale e filo passa attraverso un sicuro con filettatura buffer FIFO).
In questo caso hanno anche bisogno di aspettare per un segnale di evento che la porta si è chiuso, in modo che effettivamente possono annullare le operazioni e l'uscita in sospeso (i gradini uscite e viene eliminato).
Per rilevare se la porta USB è connectd / disconneted ascolto per il messaggio DEVICE_CHANGE
di Windows. Se la porta viene scollegato ho impostato l'evento e attende i fili di uscita prima del eliminazioni di classe di porta e chiude la porta.
Ho trovato questo approccio molto affidabile e sicuro. E 'il nucleo di una piattaforma di comunicazione che ho disegnato per oltre 8 anni fa e ancora calci.