Go Down

Topic: Non riesco a leggere una stringa da seriale .....RISOLTO!!!! (Read 2 times) previous topic - next topic

leo72

Altra cosa, sempre riferita al controllo per uscire da do..while

Code: [Select]
do {
 ...
 fineLettura = ( (index >= dimVettore) || (millis() - count > countMax));
} while (!fineLettura);

Ragioniamo.
fineLettura è il risultato di un OR logico. Per uscire dal while fineLettura deve essere true perché tu fai un test !fineLettura, che cicla finché fineLettura è false, dato che !false = true. Ma fineLettura sarà vera se anche 1 sola delle 2 condizioni è vera. Per uscire basta che una delle condizioni sia false, così che fineLettura sia anch'essa true e quindi !true = false.
E' corretta questa logica?

Paolo S

Grazie Leo..... allora:

A parte che il codice è scritto un po' male.... si mette in genere una istruzione per riga, la "riga" che tu elimini in realtà sono più istruzioni.... poi gli spazi tra la fine di una istruzione ed il ";" di fine riga proprio non si possono vedere  :smiley-sweat:
Poi c'è un controllo che non capisco.
fineLettura = ( (index >= dimVettore) || (millis() - count > countMax));

Fatto così, che senso ha? Carichi millis subito prima del check. Quella parte lì sarà sempre false finché ricevi caratteri. Sarà sempre vera se non li ricevi perché count non lo inizializzi con millis() prima di fare l'if.



Ok... per lo stile che sicuramente è da rivedere....

il controllo dovrebbe disporre l'uscita dal do-while al verificarsi di una delle due condizioni:
1) se l'indice supera la dimesione del vettore (questo si verifica quando la stringa ricevuta  è più lunga della dimesione del vettore dove conservo i byte (char) ricevuti;
2) se invece la stringa è piu corta, al raggiungimento dell'ultimo carattere dovrebbe iniziare a contare millis - count (con count che contiene l'ultimo valore di millis di quando ha letto l'ultimo carattere, quindi appena supera il tempo max di attesa significa che non ci sono più caratteri ed esce lo stesso.

ma questa parte mi pare che funzioni bene...

ciò che non funziona è la parte che dovrebbe cancellare il buffer di ricezione della seriale, cioè questa:
Code: [Select]
     Serial.print("\n  VUOTA il BUFFER: eliminati:");
     byte tempByte;
     while (Serial.available()) {tempByte = Serial.read(); Serial.write(tempByte);}
     Serial.print("\n    ---------------------\n");


e questo, io credo, sia dovuto al fatto che mentre prima la riga che contiene le quattro istruzioni di serial print, introducono un certo ritardo, fanno si che quando l'struzine passa sul serial.available lo trova positivo, perchè nel frattempo è arrivato un altro carattere, quindi entra e cancella il buffer ...

se invece tolgo quei serial.print, passa troppo rapidamente a fare quella valutazione e serial.available è false... quindi non entra e non calcella il buffer... io credo sia quasto ma non trovo la soluzione .... ogni volt che mi sembra di aver trovato qualcosa basta che tolgo qualche serial print e non funziona più....



leo72

Se è questo, metti un delay(5) al posto di quei Serial.print e guarda che succede. Oppure rivedi l'uscita con timeout perché secondo me la sua logica non è corretta (hai letto il mio ultimo post?).

Paolo S

si Leo... se metto un delay al posto dei serial print .. funziona di nuovo tutto. Ma non mi piace la soluzione. Voglio trovare una soluziione che vada bene sempre e che non rallenti il codice più di quanto non sa srettaene necessario.

l'uscita con timeout la vedo corretta perchè:
Quote

2) se invece la stringa è piu corta, al raggiungimento dell'ultimo carattere dovrebbe iniziare a contare millis - count (con count che contiene l'ultimo valore di millis di quando ha letto l'ultimo carattere, quindi appena supera il tempo max di attesa significa che non ci sono più caratteri ed esce lo stesso.


il count viene inizializzato con millis al momento della letttura dell'ultimo carattere .... quindi esce se
(millis() - count > countMax) ... che diventa vero dopo che sono passati countMax  mS ...
mi pare che questa logica sia correttà...

sto pennsando di controllare la cancellazione del buffer con un altro controllo anzichè con seruial.available... perchè e lì che cè il punto critico...

ciao








leo72

Se col delay funziona, allora significa che c'è qualcosa nell'implementazione dell'uscita con timeout. La logica dovrebbe essere come dici tu, ma lo sviluppo della funzione non la ricalca. Almeno penso.

Go Up