PDA

View Full Version : Tempo acquisizione dati C


MARCTIELLO
14-09-2009, 08:29
Ciao a tutti,
ho bisogno di un chiarimento (programmazione in C).
Il mio codice apre e inizializza una porta COM da cui acquisisce dati, che inizia a stamparmia video. La lettura inizia con un Readfile, preceduto da un WaitCommEvent che serve, per quel che so, ad aspettare a leggere finché non arriva un imput (infatti ste disconnetto il cavo tra il pc e la fonte dei dati, il programma si ferma ma non va in crash, appena lo riconnetto ricomincia tutto da dove si era fermato).

Il mio problema é: la specifica tecnica dell'apparecchiatura che mi da i dati mi dice che questi ultimi vengono inviati con una frequenza di 1,4 Hz (sto parlando di 23 elementi inviati a 1,4 Hz), ma il mio programma me li stampa a video molto piś lentamente (diciamo che tarda almeno 15 secondi, io li voglio visualizzati in 0,71 secondi...).

La domanda é: Come posso ottenere la visualizzazione dei dati a 1,4 Hz? Ancora non ho capito se é un problema di inizializzazione della porta COM...ho provato a giostare con i valori del parametro CommTimeouts..ma sembra che le cose non cambiano...:muro:

Grazie in anticipo!!

fero86
14-09-2009, 11:55
é possibile che sia un banalissimo problema di flush di stdout, che nulla c'entra con la porta COM? prova con la fflush.

MARCTIELLO
14-09-2009, 12:28
grazie fero, ma anche con la fflush la cosa sembra non funzionare...do per scontato che l'apparecchio mi invia realmente dati a 1,4 Hz, quindi non so....
Le informazioni vengono inviate un byte alla volta..quindi ho definito un tipo BYTE chiamata RISPOSTA e gli dico di leggere un byte alla volta e mettere il valore in RISPOSTA. Salvo il contenuto di RISPOSTA[0] in un altro byte DATO[j] che sta in un ciclo che va da 0 a 22 (mi interessa che DATO abbia dimensione 23) e stampo a video, continuamente, finké non batto un tasto, i vari DATO[j]....
giį..sicuramente il problema sta nel buffer, perché me ne stampa 5 alla volta, aspetta mezzo secondo e me ne da altri 5 (a volte 4) e cosķ via...

_Claudio
14-09-2009, 12:44
Prova a fare un programmino che verifica ogni quanto realmente arrivano i dati.

Poi controlla le tempistiche di reazione del tuo programma, ovviamente devono essere pił veloci dell'arrivo dei dati.

MARCTIELLO
14-09-2009, 12:47
Immagino che gli diró di stamparmi, vicino al dato, anche un'indicazione di tempo, poi faccio la differenza e vedo cn che frequenza arrivano i dati...bene..mi metteró a cercare come si richiedono i tempi (purtroppo non ho mai studiato programmazione, sono un disegnatore di strutture riciclato x la causa alla programmazione!!!) e vediamo che succede...

a presto e grazie a tutti!

_Claudio
14-09-2009, 13:13
Immagino che gli diró di stamparmi, vicino al dato, anche un'indicazione di tempo, poi faccio la differenza e vedo cn che frequenza arrivano i dati...bene..mi metteró a cercare come si richiedono i tempi (purtroppo non ho mai studiato programmazione, sono un disegnatore di strutture riciclato x la causa alla programmazione!!!) e vediamo che succede...

a presto e grazie a tutti!

Usa i timer del sistema operativo, forniti dalle API specifiche.
Purtroppo quando si comunica con l'esterno non bisogna fidarsi delle specifiche ma piuttosto di quello che realmente avviene.

Il mio consiglio č fare un programmino a parte ottimizzato per la verifica dei tempi, puņ essere che il programma che hai fatto, essendo te un neofita, non sia ottimizzato e richieda pił tempo del necessario, quando si gestiscono le temporizzazioni nei SO bisogna usare accorgimenti stringenti sulle performance piuttosto che avere un algoritmo di ottima qualitą formale.

Spesso mi č tornato utile acquisire i dati con un thread separato ad alta prioritą, meglio se gira a bassissimo livello nel SO, che interagisce poi a parte col thread che gestisce l'interazione con l'utente.