Go Down

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

leo72


Paolo S

#1
Jan 05, 2013, 06:56 pm Last Edit: Jan 07, 2013, 04:10 pm by Paolo S Reason: 1
Non riesco a leggere un stringa dalla seriale come vorrei io..
cioè sto cercando di mettere in un vettore di char la stringa che invio dalla seriale .. per il processamento successivo.

cioè se invio "ABCDEFGHIL" (senza gli apici) e fisso la lunghezza del vettore a 4, vorrei avere questo
stringa(0) ---> A
stringa(1) ---> B
stringa(2) ---> C
stringa(3) ---> D

ho cercato e letto decine di post che riguardano questo problema.
Ho capito che il problema è originato dalla velocità di lettura rispetto alla velocità di ricezione dei dati sulla seriale ..

ho fatto questo script e funziona, fintanto che ci sono le stampe su serial monitor per il debug:



Code: [Select]

#define dimVettore 5            // lunghezza max del buffer di lettura (stringa seriale)
char stringaSERIALE[dimVettore + 1]; // stringa buffer for contenente le letture estratte dal GPS
boolean fineLettura;                 // controllo sul checksum della stringa Seriale ricevuta

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

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

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

 
    Serial.print("\n  VUOTA il BUFFER: eliminati:");
    byte tempByte;
    while (Serial.available()) {tempByte = Serial.read(); Serial.write(tempByte);}
    Serial.print("\n    ---------------------\n");
     
 
 
    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");
}


tutto questo funziona, ma basta che elimino una riga e già non funziona più...
Code: [Select]

#define dimVettore 5            // lunghezza max del buffer di lettura (stringa seriale)
char stringaSERIALE[dimVettore + 1]; // stringa buffer for contenente le letture estratte dal GPS
boolean fineLettura;                 // controllo sul checksum della stringa Seriale ricevuta

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

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

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

 
    Serial.print("\n  VUOTA il BUFFER: eliminati:");
    byte tempByte;
    while (Serial.available()) {tempByte = Serial.read(); Serial.write(tempByte);}
    Serial.print("\n    ---------------------\n");
     
 
 
    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");
}


... mi sta facendo impazzire.... se già non lo sono!!!! ... che cavolo gli devo fare perchè funzioni sempre ..

Go Up