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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top