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?

È stato utile?

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.

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