Quando si apre una porta, la classe SerialPort attiva un nuovo thread sotto il cofano che è responsabile (tramite la funzione API di Windows WaitCommEvent) per attendere l'attività della porta seriale (ad esempio i dati arrivati) e attivare gli eventi appropriati sul proprio gestori. Ecco perché eventi come DataReceived si verificano effettivamente su un thread secondario.
Quando si chiude la porta, la chiamata Close() restituisce immediatamente ma è necessario del tempo prima che il thread secondario ruoti verso il basso.
Se si tenta di riaprire la porta troppo rapidamente dopo aver chiamato Chiudi e il thread non è ancora stato ruotato, l'istanza SerialPort non è in uno stato in cui è possibile iniziare una nuova connessione.
Nota i MSDN documentation for SerialPort.Close stati:
La pratica migliore per ogni applicazione è di aspettare per una certa quantità di tempo dopo aver chiamato il metodo Close prima di tentare di chiamare il metodo Open , come la porta non può essere chiuso all'istante.
È possibile tenere traccia di quando si è chiusa la porta e prima di riaprirla assicurarsi che sia trascorso un certo timeout arbitrario.
Non c'è bisogno di dormire prima di letture/scritture, anche se un paio di stranezze da tenere a mente:
tenere a mente la classe SerialPort in .NET BCL si basa ancora sul sottostante API Win32, e io non credo che è ottenuto un sacco di amore da Microsoft sinc e l'implementazione iniziale.
Per ulteriori informazioni si veda:
che avrebbe più senso se il sonno è stato dopo openning e dopo la chiusura di Dagli tempo per eithe r stabilire o terminare una connessione – Prix
Conosco i vecchi tempi di ISA, dovresti stare attento a non inviare cose alle porte troppo velocemente o potrebbe causare problemi. Mi chiedo quanto sia ancora così, e quanto di questo è un culto settario? – cHao