Go Down

Topic: comando corretto per pulire la seriale su arduino uno ide 101 (Read 1 time) previous topic - next topic

gingardu

qual'è il comando piu corretto per pulire la seriale su arduino uno ide 101

mi pare che serian.flush    non funge    =(
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

BrainBooster


gingardu

ci sara pure un qualcosa che svuota il buffer  senza riavviare il tutto?
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

niki77

Sulla carta è Serial.flush

Se poi non funziona come dovrebbe è un altro discorso.
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

astrobeed


ci sara pure un qualcosa che svuota il buffer  senza riavviare il tutto?


Metodo flush
Code: [Select]

Waits for the transmission of outgoing serial data to complete. (Prior to Arduino 1.0,
this instead removed any buffered incoming serial data.)


Ovvero la flush, a partire dalla versione 1.0, attende che siano stati trasmessi tutti i caratteri pendenti nel buffer, non azzera il buffer di ricezione come invece avveniva con le versioni precedenti dell'IDE

La serial.begin non riavvia nulla, si limita a settare i registri macchina della UART per il corretto valore di baud rate e attivarla.
Con l'IDE 1.x il solo modo per svuotare il buffer di ricezione della seriale è continuare a leggerlo fino a che non è vuoto, ovvero devi usare una  "while (Serial.available() > 0) a=Serial.read();" ove "a" è una variabile di tipo char fittizia.


gingardu

quindi anche una riga cosi fa la stessa cosa?

byte a=Serial.read();
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

astrobeed


quindi anche una riga cosi fa la stessa cosa?
byte a=Serial.read();


No, ti svuota un solo carattere del buffer, devi usare la while come te l'ho scritta io.

Per capirci meglio:
Code: [Select]

while (Serial.available() > 0) a=Serial.read();


Solo in questo modo svuoti completamente il buffer di ricezione.

gingardu

ma non funziona  :smiley-eek-blue:

ho  messo la riga nel loop ma i seria print vengono stampati lo stesso
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

astrobeed


ma non funziona  :smiley-eek-blue:


Funziona sicuramente, posta il codice che stai usando perché sicuramente hai commesso qualche errore.


gingardu


ho aggiunto la  riga all'inizio e alla fine de loop e messa ache in altri 2 posti
4 voltein totoale

ma se apro il serial monitor e scrivo numeri  e faccio invio questi passano lo stesso
Code: [Select]


[codelong vet[6] = {
 -2, -2, -2, -2, -2,  -2 };

byte segnale=1;  
long cont = 0;
long x = 0;
char a;


void setup()
{
 pinMode (11, INPUT);
 pinMode (12, OUTPUT);  
 pinMode (13, OUTPUT);

 digitalWrite (13, HIGH);
Serial.begin(9600);
}

void loop()
{



while (Serial.available() > 0) a=Serial.read();

 if ( digitalRead (11)==LOW) segnale=1,  digitalWrite (13, HIGH);


 
if (segnale == 1  && digitalRead (11)==HIGH)

   while (Serial.available() > 0)
  {
     vet[cont] = Serial.read()-48;
     cont++;
     delay(60);

   }



 if(cont > 0)
 {
   cont = 0;


   if (vet[5] ==  -2  && vet[4] ==  -2  && vet[3] ==  -2  && vet[2] ==  -2  && vet[1] ==  -2 )

   {                                                                      
       x = vet[0];                                                        
   }
   else

       if (vet[5] ==  -2  && vet[4] ==  -2  && vet[3] ==  -2  && vet[2] ==  -2 ) //  
     {
       x = (vet[0]* 10 +   vet[1]    );
     }
     else
       if  ( vet[5] ==  -2  && vet[4] ==  -2  && vet[3] ==  -2 ) //
       {
         x = (vet[0] * 100 + vet[1]* 10+ vet[2]);
       }
       else
         if  (vet[5] ==  -2  && vet[4] ==  -2  )
         {
           x = (vet[0] * 1000 + vet[1] * 100 + vet[2]* 10 + vet[3]);  
         }
         else
           if  (vet[5] ==  -2   )
           {
             x = (vet[0] * 10000 + vet[1] * 1000 + vet[2]* 100 + vet[3]* 10 + vet[4]);  

           }


while (Serial.available() > 0) a=Serial.read();
           Serial.println(x);


while (Serial.available() > 0) a=Serial.read();
 }
 while (Serial.available() > 0) a=Serial.read();
}
]
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

astrobeed


ma se apro il serial monitor e scrivo numeri  e faccio invio questi passano lo stesso


Nel tuo codice vedo solo una serial.print che stampa una variabile calcolata all'interno del programma, quindi è normale che la vedi.
Mi dovresti spiegare cosa intendi con "passano lo stesso" perché in tutti i casi quello che invii sulla seriale arriva sempre e comunque ad Arduino e viene memorizzato nel relativo buffer, poi sta a te cancellarlo, dopo la ricezione, se questi dati non ti servono.

BrainBooster

Puoi provare aggiugendo questa funzione da richiamare all'occorrenza
Code: [Select]

void svuota_seriale( void )
{
unsigned char dummy;
while ( UCSR0A & (1<<RXC0) ) dummy = UDR0;
}

fà la stesa cosa del codice di astrobeed

astrobeed


fà la stesa cosa del codice di astrobeed


Sicuro ? Per me svuota solo il buffer, monobyte, del Atmega328, quello software da 64 byte no.

BrainBooster

#13
Oct 18, 2012, 11:01 am Last Edit: Oct 18, 2012, 11:04 am by BrainBooster Reason: 1
no, il ringbuffer software della seriale no.
per quello potrebbe provare a spegnere la seriale alla fine del loop e riaccenderla all' con un Serial.end e un Serial.begin no?

gingardu

in "soldoni"
 
ci vuole un comando (a comando) 
magari con d'avanti un if
che svuoti la seriale da "spazzatura" preesistente

()se no non ha troppo senso)
una cosa cosi e utile es:

if ( digitalRead (11)==LOW)  "svuota tutto il buffer seriale" ;
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Go Up