Pages: 1 [2]   Go Down
Author Topic: Non riesco a leggere una stringa da seriale .....RISOLTO!!!!  (Read 2016 times)
0 Members and 1 Guest are viewing this topic.
Oristano
Offline Offline
Sr. Member
****
Karma: 0
Posts: 252
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

credo di aver trovato la soluzione:

il carattere lo leggo così:
Code:
do    
     {
        if(Serial.available()> 0)                
          {
           stringaSERIALE[index]=Serial.read();  
           index++; count = millis();                            
            }
      fineLettura = ( (index >= dimVettore) || (millis() - count > countMax));
     }
 while (!fineLettura);  

quindi c'è un ciclo do - while controllato dalla variabile booleana "fineLettura". all'interno, però,  c'è un IF nidificato che fa si che si possa leggere il carattere solo se serial.vailable è true ... se è falso ì non viene letto nulla, ma non esce comunque dal do-while .. attende, infatti, che serial.vailable sia di nuovo vero , se nel frattempo è arrivato un altro carattere, oppure aspetta il timeout (perchè non sono arrivati altri caratteri... Tutto questo funziona bene....

devo semplicemente riproporre lo stesso meccanismo per cancellare il buffer della seriale, quando è uscito dal primo do-while.. e tutto funzionerà (.. almeno credo)...
insomma questo è sbagliato:
Code:
 while (Serial.available()) {tempByte = Serial.read();}
devo riproporre lo stesso schema, con do-while controllato con una condizione logica, e timeout per accertarsi che non ci sia più nulla in coda al buffer (come faccio sopra per leggere il carattere) .. altrimenti, se non faccio così,  se l'esecuzione passa velocemente a queste istruzioni (come quando cancello i serial.print di debug), trova serial.available ancora false, perchè non è ancora giunto il byte (specie se la connesisone seriale è impostata a bassa velocità) e mi salta la cancellazione del buffer, quindi al ciclo successivo mi mette nel mio vettore gli ultimi valori ricevuti anzichè i primi ...
Credo sia questa la soluzione .... stasera riprovo con questa idea ...
grazie ciao
« Last Edit: January 07, 2013, 10:10:34 am by Paolo S » Logged

Oristano
Offline Offline
Sr. Member
****
Karma: 0
Posts: 252
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok... adesso funziona bene .... così:

Code:
#define dimVettore 4            // lunghezza max del buffer di lettura (stringa seriale)
char stringaSERIALE[dimVettore + 1]; // stringa buffer for contenente le letture estratte dal GPS

void setup()
{
Serial.begin(4800);
}

void loop()
{
if (Serial.available()>0){leggiSeriale();}
}


void leggiSeriale()
 {
   unsigned long count = millis();      //interrompe la lettura dalla seriale se passano più di countMax ms senza che arrivino caratteri
   unsigned long const countMax = 5;    // limite max millisecondi senza che arrivino caratteri .. oltre chiude il ciclo di lettura (non scendere sotto i 5)
   boolean fineLettura;                 
   
   int index=0;
   // LEGGE i primi dimVettore caratteri ........
   do   
     {
        if(Serial.available()> 0)               
         {
           stringaSERIALE[index]=Serial.read(); count = millis(); 
           index++;                           
         }
         fineLettura = ( (index >= dimVettore) || (millis() - count > countMax));
      }
    while (!fineLettura);   

     fineLettura = false;

    byte tempByte;
   // CANCELLA il buffer, se c'è ancora qualcosa nel buffer .....
   do
     {
       if(Serial.available()> 0)               
       {
         tempByte = Serial.read(); count = millis();                         
       }
       fineLettura = (millis() - count > countMax);
     }
   while (!fineLettura);
 
     Serial.print("\n INIZIO VETTORE MEMORIZZATO");
     Serial.print("\n index:"); Serial.print(index);
     for(int k=0; k<index; k++){
                            Serial.print("\n\t k=")   ; Serial.print(k);
                            Serial.print("\t   ")     ; Serial.print(stringaSERIALE[k], DEC);
                            Serial.print("\t   ")     ; Serial.print(stringaSERIALE[k]);
                          }
      Serial.print("\n FINE VETTORE MEMORIZZATO \n\n\n");
}
adesso posso passare al post-proccesso della stringa....
grazie ciao
« Last Edit: January 07, 2013, 10:01:11 am by Paolo S » Logged

Pages: 1 [2]   Go Up
Jump to: