|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
[C++] Come creare un ciclo di attesa per leggere su una porta
Salve a tutti.
Devo fare la lettura di un buffer su una porta seriale, usando una libreria di comunicazione seriale (RS232.h) che ho trovato in rete, gratuita. Funziona bene, ma l'unica cosa che gli manca è un timer di scadenza per la lettura sulla porta, nel senso che quando faccio la lettura deve attendere un tot di secondi e poi dichiarare il timeout, un timeout che gli assegno io. Avevo pensato di fare una sorta di ciclo while o for, ma non saprei come comportarmi. Insomma, vorrei ottenereu una cosa del tipo Do { legge sulla porta; incrementa un contatore del tempo; } while (timeout) || (lettura>0) solo che con la libreria time.h o ctime.h non ci ho mai avuto a che fare...e quindi volevo chiedere se qualcuno sa darmi una dritta su come fare in modo che questa cosa funzioni: del tipo, assegnato un time out di 3 secondi, tale ciclo attenda di avere una lettura (byte letti>0) oppure attenda massimo 3 secondi e poi esca e dichiari il timeout. Come posso fare?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
Forse è un pò troppo per leggere semplicemente su una porta...è un timer che mi serve...il "tick" come faccio poi a renderlo vincolato al timeout oppure al fatto che abbia letto qualcosa? Il ciclo Do-While è corretto in tal caso? Oppure è meglio un FOR su una variabile di tipo TIME ad esempio?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
No sono dei semplici segnali... servono a far comunicare i processi tra di loro e tu potresti sfruttarli per creare il tuo timeout
http://it.wikipedia.org/wiki/Segnale_(informatica) forse però non ho ben capito io il meccanismo del tuo algoritmo |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
A me serve un controllo sulla lettura che sia vincolato al tempo e ai byte che la funzione di lettura restituisce.
Se ha letto (byte >0) oppure è passato il tempo "timeout" deve uscire e comunicare "Timeout". Ora, se il timeout lo fisso all'avvio del programma, esempio 3 secondi, come posso fare per fare in modo che quando chiamo la funzione di lettura, un ciclo di controllo me la gestisca in questo modo?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Codice:
long endValue = clock() + CLOCKS_PER_SEC * timeOutValue;
while (clock() < endValue || lettura > 0) {
// Codice per la lettura dalla porta
Sleep(waitTime);
}
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Quote:
un piccolo esempio qui --> http://publib.boulder.ibm.com/infoce...2Fsigalarm.htm |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
In pratica: o attende 3 secondi o attende di avere un buffer di lettura, se legge qualcosa entro un secondo, può smettere di "attendere" ecco perchè servirebbe un timer vincolato al tempo si ma anche all'esito della lettura..per non far attendere per forza 3 secondi se la risposta è già pervenuta a 2 secondi ad esempio...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Ma lavori su Linux o Windows?
P.S. I file .h sono semplici include non librerie ... |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
in linux...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Ultima modifica di [Kendall] : 16-04-2012 alle 15:08. |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Per fare quello che chiedi hai bisogno di aprire la seriale in modalità asincrona. Altrimenti la lettura rimarrà bloccata fino a che non arriva qualcosa e non avrai modo di sbloccarla.
Dovresti aprire la seriale con il parametro O_NONBLOCK. |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
è un timer fissato su tot secondi che devo associare, che parte quando avvio la lettura e finisce dopo tot secondi...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
Codice:
long endValue = clock() + CLOCKS_PER_SEC * timeOutValue;
while (clock() < endValue || lettura > 0) {
// Codice per la lettura dalla porta
Sleep(waitTime);
}
immagino che timeoutvalue sia quello che imposto io in millisecondi, giusto? pertanto 3000, o no? e waittime? dove lo piglia? grazie ancora per la disponibilità.
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
endValue è il valore del clock finale, dopo il quale uscire dal ciclo. Lo trovi leggendo il valore dei clock prima di entrare nel ciclo, aggiungendo il tempo che vuoi far attendere prima di uscire dal while. CLOCKS_PER_SEC è una costante definita nel sistema, e indica il numero di clock per secondo nel sistema utilizzato. Questo di conseguenza devi moltiplicarlo per il numero di secondi che vuoi far attendere (3 nel caso precedente). waitTime è il valore (solitamente in millisecondi, ma devi vedere la funzione precisa in linux che valore richiede) di attesa ad ogni ciclo. Lo imposti tu! Come ti dicevo non serve a scandire il tempo (non sarebbe un indicatore preciso), ma a fissarti la frequenza di "check" per la lettura della porta. Se per esempio lo imposti a un decimo di secondo automaticamente quel ciclo verrà temporizzato ed eseguito una volta ogni decimo di secondo (diminuendo il carico sulla cpu). |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:09.




















