Torna indietro   Hardware Upgrade Forum > Software > Programmazione

KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo
KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo
KTC lancia il nuovo monitor gaming H27E6, un modello da 27 pollici che promette prestazioni estreme grazie al pannello Fast IPS con risoluzione 2K QHD (2560x1440). Il monitor si posiziona come una scelta cruciale per gli appassionati di eSport e i professionisti creativi, combinando una frequenza di aggiornamento di 300Hz e un tempo di risposta di 1ms con un'eccezionale fedeltà cromatica
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-04-2012, 10:54   #1
DomusP45
Senior Member
 
L'Avatar di DomusP45
 
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 è.
DomusP45 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 11:12   #2
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da DomusP45 Guarda i messaggi
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?
la libreria ctime contiene delle funzioni interessanti a riguardo. Ti permette per esempio di utilizzare un tick counter che restituisce il numero di clock della cpu dall'avvio del programma. Essendo i clock strettamente legati al tempo (c'è proprio una costante definita per ogni sistema, CLOCKS_PER_SEC) puoi crearti facilmente un semplice timer. Io ne avevo creato uno tempo fa, anche se implementava caratteristiche che a te decisamente non servono (nel senso che ti basterebbe una cosa ben più semplice).
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 12:22   #3
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Oppure postresti gestire il tutto con un SIGALRM.

Fai inviare il segnale dopo il tuo timeout e con sigaction lo gestisci
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 12:26   #4
DomusP45
Senior Member
 
L'Avatar di DomusP45
 
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
Quote:
Originariamente inviato da clockover Guarda i messaggi
Oppure postresti gestire il tutto con un SIGALRM.

Fai inviare il segnale dopo il tuo timeout e con sigaction lo gestisci
ma questo cos'è? una gestione a thread per caso?

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 è.
DomusP45 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 12:33   #5
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da DomusP45 Guarda i messaggi
ma questo cos'è? una gestione a thread per caso?
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
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 12:45   #6
DomusP45
Senior Member
 
L'Avatar di DomusP45
 
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 è.
DomusP45 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 12:50   #7
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da DomusP45 Guarda i messaggi
ma questo cos'è? una gestione a thread per caso?

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?
Puoi fare una cosa del genere:

Codice:
long endValue = clock() + CLOCKS_PER_SEC * timeOutValue;
while (clock() < endValue || lettura > 0) {
   // Codice per la lettura dalla porta
  Sleep(waitTime);
}
La funzione di Sleep() serve per temporizzare la lettura, per evitare che venga ripetuta costantemente ma solo dopo tot millisecondi (così da alleggerire la cpu). Per la sintassi precisa del comando Sleep() meglio che guardi in internet, io son andato "a ricordo"
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 12:54   #8
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da DomusP45 Guarda i messaggi
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?
Io probabilmente imposterei un flag che sarà controllato dal ciclo. Questo flag viene impostato dalla funzione sigaction al momento della ricezione del segnale SIGALRM.

un piccolo esempio qui --> http://publib.boulder.ibm.com/infoce...2Fsigalarm.htm
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 12:56   #9
DomusP45
Senior Member
 
L'Avatar di DomusP45
 
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
Quote:
Originariamente inviato da [Kendall] Guarda i messaggi
Puoi fare una cosa del genere:

Codice:
long endValue = clock() + CLOCKS_PER_SEC * timeOutValue;
while (clock() < endValue || lettura > 0) {
   // Codice per la lettura dalla porta
  Sleep(waitTime);
}
La funzione di Sleep() serve per temporizzare la lettura, per evitare che venga ripetuta costantemente ma solo dopo tot millisecondi (così da alleggerire la cpu). Per la sintassi precisa del comando Sleep() meglio che guardi in internet, io son andato "a ricordo"
beh, sleep() la conosco...insomma fino ad ora l'ho usata proprio per attendere prima di leggere 2 secondi, poi faceva la lettura e comunicava l'output. Ma mi è stato chiesto che il tempo di attesa deve essere specificato dall'utente del programma in fase di avvio e che la lettura deve durare anche meno del timeout se la risposta sulla porta arriva prima dei 3 secondi ad esempio.

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 è.
DomusP45 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 13:29   #10
lorenzo001
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 ...
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 14:09   #11
DomusP45
Senior Member
 
L'Avatar di DomusP45
 
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
Quote:
Originariamente inviato da lorenzo001 Guarda i messaggi
Ma lavori su Linux o Windows?

P.S. I file .h sono semplici include non librerie ...
in linux...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è.
DomusP45 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 15:05   #12
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da DomusP45 Guarda i messaggi
beh, sleep() la conosco...insomma fino ad ora l'ho usata proprio per attendere prima di leggere 2 secondi, poi faceva la lettura e comunicava l'output. Ma mi è stato chiesto che il tempo di attesa deve essere specificato dall'utente del programma in fase di avvio e che la lettura deve durare anche meno del timeout se la risposta sulla porta arriva prima dei 3 secondi ad esempio.

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...
Pensavo che la variabile lettura fosse utilizzata proprio per fare la verifica di lettura. Infatti nel mio esempio la mettevo come seconda condizione di uscita dal while. Per quanto concerne lo Sleep(), non lo utilizzavo per bloccare il ciclo, ma con valori molto bassi (dell'ordine del decimo di secondo) per evitare che quel ciclo venisse ripetuto per migliaia e migliaia di volte, caricando inutilmente la cpu. Pertanto lo sleep non temporizza nulla, ma semplicemente scandisce la frequenza di check del loop (non so se mi son fatto capire). Se sei sotto linux mi sembra che lo sleep ci sia, ma in una forma leggermente diversa sintatticamente.

Ultima modifica di [Kendall] : 16-04-2012 alle 15:08.
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 16:47   #13
tomminno
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.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 16:53   #14
DomusP45
Senior Member
 
L'Avatar di DomusP45
 
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
Quote:
Originariamente inviato da tomminno Guarda i messaggi
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.
la seriale è così che viene aperta...a me interessa come fare a vincolare la lettura che duri massimo 3 secondi e poi comunichi il timeout se non arriva niente entro il tempo di timeout...

è 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 è.
DomusP45 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 17:57   #15
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da DomusP45 Guarda i messaggi
la seriale è così che viene aperta...a me interessa come fare a vincolare la lettura che duri massimo 3 secondi e poi comunichi il timeout se non arriva niente entro il tempo di timeout...

è un timer fissato su tot secondi che devo associare, che parte quando avvio la lettura e finisce dopo tot secondi...
Il codice che ti ho scritto qualche post più sopra fa proprio questo.
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 19:08   #16
DomusP45
Senior Member
 
L'Avatar di DomusP45
 
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
Quote:
Originariamente inviato da [Kendall] Guarda i messaggi
Il codice che ti ho scritto qualche post più sopra fa proprio questo.
Intendi questo?

Codice:
long endValue = clock() + CLOCKS_PER_SEC * timeOutValue;
while (clock() < endValue || lettura > 0) {
   // Codice per la lettura dalla porta
  Sleep(waitTime);
}
Allora dimmi: endValue cosa sarebbe? CLOCKS-PER-SEC cos'è?
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 è.
DomusP45 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 20:44   #17
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da DomusP45 Guarda i messaggi
Intendi questo?

Codice:
long endValue = clock() + CLOCKS_PER_SEC * timeOutValue;
while (clock() < endValue || lettura > 0) {
   // Codice per la lettura dalla porta
  Sleep(waitTime);
}
Allora dimmi: endValue cosa sarebbe? CLOCKS-PER-SEC cos'è?
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à.
Ho usato delle variabili che fossero più chiare possibili:

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).
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 20:55   #18
DomusP45
Senior Member
 
L'Avatar di DomusP45
 
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
Quote:
Originariamente inviato da [Kendall] Guarda i messaggi
Ho usato delle variabili che fossero più chiare possibili:

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).
ok...ora mi fermo un pò...domani provo e ti aggiorno...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è.
DomusP45 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2012, 23:18   #19
british
Member
 
L'Avatar di british
 
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
Puoi usare la select(2) con il parametro di timeout.
Oppure, come ti suggerisce clockover, usare un SIGALRM.
british è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2012, 12:01   #20
DomusP45
Senior Member
 
L'Avatar di DomusP45
 
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
Quote:
Originariamente inviato da [Kendall] Guarda i messaggi
Ho usato delle variabili che fossero più chiare possibili:

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).
mi spiace ma non funziona.. non aspetta...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è.
DomusP45 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo KTC H27E6 a 300Hz e 1ms: come i rivali ma a met&...
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
GeForce RTX 50 SUPER cancellate o rimand...
Windows 11 si prepara a vibrare: Microso...
La “Burnout Season” colpisce l’Italia: i...
QNAP annuncia il JBOD TL-R6020Sep-RP: ol...
Siemens e NVIDIA uniscono le forze: arri...
Ricarica veloce e durata batteria: miti ...
Le "navi volanti" di Candela a...
Bambini su misura? Il caso della startup...
Iliad porta le SIM Express in edicola: r...
Offerte Amazon sui TV Mini LED Hisense 2...
Il silenzio digitale che fa male: come i...
Il responsabile del programma Cybertruck...
Domanda alle stelle per SSD e RAM: in Gi...
Zuckerberg vuole eliminare tutte le mala...
Otto suicidi, un solo chatbot: si moltip...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v