Win32 API: ReadFile non timeout
-
09-10-2019 - |
Domanda
Sto scrivendo del codice per l'interfaccia con un pezzo di hardware. Si connette hardware al PC tramite una porta USB con un convertitore USB-seriale all'interno del dispositivo (si presenta come un dispositivo porta COM in Windows).
Sto avendo problemi con la chiamata di sistema API Win32 ReadFile. Io non riesco a farlo funzionare come pubblicizzato. I ha installato hai la COMMTIMEOUTS struttura come:
COMMTIMEOUTS ct;
ct.ReadIntervalTimeout = MAXDWORD;
ct.ReadTotalTimeoutconstant = 0;
ct.ReadTotalTimeoutMultiplier = 0;
ct.WriteTotalTimeoutConstant = 0;
ct.WriteTotalTimeoutMultiplier = 0;
if(SetCommTimeouts(device_id_, &ct) == 0)
{
return ERROR; // this is never hit.
}
Che secondo la documentazione delle API Win32, dice:
ReadIntervalTimeout
Il tempo massimo deve trascorrere tra l'arrivo di due byte su comunicazioni linea, in millisecondi. Durante un operazione ReadFile, il periodo di tempo inizia quando il primo byte è ricevuto. Se l'intervallo tra la arrivo di due qualsiasi byte supera questo importo, la ReadFile operazione è compilata e dati bufferizzati è restituito. Un valore di zero indica quell'intervallo timeout non vengono utilizzati.
Un valore di MAXDWORD, in combinazione con valori zero sia per il ReadTotalTimeoutConstant e ReadTotalTimeoutMultiplier i membri, specifica che l'operazione di lettura è restituire immediatamente con i byte che sono già stati ricevuti, anche se non sono stati ricevuti byte.
Il comando che sto inviando deve restituire un singolo intero di byte. La maggior parte del tempo, il comando viene ricevuto dal dispositivo e restituisce il valore appropriato. A volte, tuttavia, non sembra restituire un valore e blocchi ReadFile () fino a più byte sono recieved (es. Premendo i pulsanti sul dispositivo). Una volta che un tasto viene colpito, la risposta iniziale intero mi aspettavo ricevuto insieme al codice premere il pulsante. Anche se questo non è il comportamento mi aspetto dal dispositivo stesso, Sono più preoccupato con ReadFile () blocco quando non dovrebbe essere, secondo la documentazione MSDN. Esiste un rimedio per ReadFile () bloccando qui?
Soluzione
D'oh! Si scopre che ReadFile blocco era solo un sintomo, non il problema. Il dispositivo hardware in questione ha solo processore 4MHz in esso. Dividere il comando 3 carattere scritto al dispositivo e inviando loro individualmente con una pausa di 1 ms tra correzioni di personaggi della questione.