Sto scrivendo una classe IO per caricare/scaricare file su un controller su seriale RS-232. Sfortunatamente, non posso inviare un intero file tutto in una volta, devo dividerlo in pacchetti e inviarlo un po 'alla volta. Ecco l'approccio di base ...Sleep() è un disegno errato, ma sembra essere la mia unica opzione
ifstream file ("path/to/file.ext", ios::in | ios::binary);
while(!file.eof())
{
//... zero buffer, and add packet header (8 bytes)
size_t nResult = file.read(&buffer[8], 129);
Serial.Write(buffer, nResult+8);
//... see if controller wrote anything to the serial port and process it's command
Sleep(600);
}
So che l'uso di sonno() non è una buona pratica di progettazione, ma se mi tolgo la dichiarazione di sonno() o addirittura ridurre il tempo di quantità del ciclo dorme, il regolatore genera errori sul fatto che il buffer è pieno e il trasferimento fallisce. C'è un modo migliore per farlo?
Prima di dirlo, no non posso inviare un messaggio al controller per determinare se è pronto per il pacchetto successivo. Non ha quella funzionalità.
Modifica: "cieca" Ho dimenticato di dire che l'intervallo in cui sto avendo a dormire è un po ' Le specifiche del protocollo fornite dal produttore non forniscono dettagli sui tempi necessari tra i pacchetti. Quindi ho dovuto determinare quel valore per tentativi ed errori. Ho paura che potrebbe non funzionare su tutti i PC e molto altro in modo che non funzioni su tutti i controller.
Questo sviluppo è in corso per Windows XP/Vista/7.
Modifica # 2: Inoltre, la quantità di dati per pacchetto è in realtà anche un'indagine su tentativi ed errori. La specifica del protocollo consente di pacchetti di 65.535 byte (inclusa l'intestazione). Ma se si inviano più di 129 byte alla volta, si iniziano a vedere i problemi dove a volte funziona e talvolta no. Sembra anche esserci una relazione tra il tempo che devi dormire e la quantità di byte che puoi inviare. Se rilascio la dimensione del pacchetto fino a 20 byte per pacchetto, posso ridurre il tempo di sospensione a 400 millisecondi. Credo che la ragione di questi problemi derivi dal tempo impiegato dal controller per spostare i dati dal suo buffer al file.
Hai sempre una risposta dal controller? – dwo
Se i requisiti hardware includono l'invio di così tanti byte alla volta e quindi l'attesa di così tanti millisecondi, non esiste un modo ovviamente migliore per implementarlo. – Gabe
Sì, oserei dire che usare il sonno non è poi così male. Suppongo che potresti scrivere una funzione di fantasia tra cui ma date le tue condizioni, Sleep() sembra ragionevole. –
ScarletAmaranth