Mi sto tirando i capelli cercando di capire quando una porta seriale termina la chiusura in modo da poterla riaprire. Si scopre che CloseHandle()
ritorna prima che la porta sia effettivamente sbloccata.CloseHandle() restituisce prima che la porta seriale sia effettivamente chiusa
sto aprendo una porta seriale utilizzando CreateFile(FILE_FLAG_OVERLAPPED)
, associandolo con un CompletionPort utilizzando CreateIoCompletionPort()
, lettura/scrittura ad esso utilizzando ReadFile()
, WriteFile()
e chiudendo utilizzando CloseHandle()
.
Ho notato che se chiudo e riapuro una porta seriale abbastanza velocemente, viene restituito uno da CreateFile()
. Ciò sta accadendo nonostante io stia aspettando il ritorno di CloseHandle()
, quindi attendo che tutte le operazioni di lettura/scrittura in sospeso associate a quell'handle vengano restituite dalla porta di completamento. Sicuramente c'è un modo migliore :)
Come si chiude una porta seriale in modo sincrono? Si prega di non ripetere i loop, sleep() o qualche altro hack economico.
EDIT: Forse questo ha qualcosa a che fare con il mio utilizzo delle porte di completamento e FILE_FLAG_OVERLAPPED. Ricevo una richiamata quando le operazioni di lettura/scrittura sono complete. C'è una sorta di callback per la chiusura del porto?
Forse correlato al driver della porta seriale specifico. Hai visto questo qui su SO: http://stackoverflow.com/questions/2948428/reopening-serial-port-fails-if-not-closed-properly-with-closehandle –
Giusto per essere sicuro .... tu paradiso usare 'DuplicateHandle' ovunque? –
Non sono sicuro che la porta di completamento sia correlata, ho sempre usato i callback APC con 'ReadFileEx' e' WriteFileEx'. Ciò è anche più semplice, poiché gli APC vengono eseguiti solo quando il thread entra in attesa, quindi non ci sono problemi di sincronizzazione tra thread (basta fare attenzione al re-entrancy). –