comando corretto per pulire la seriale su arduino uno ide 101

ma non funziona :fearful:

ho messo la riga nel loop ma i seria print vengono stampati lo stesso

gingardu:
ma non funziona :fearful:

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

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

[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();
}
]

gingardu:
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.

Puoi provare aggiugendo questa funzione da richiamare all'occorrenza

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

fà la stesa cosa del codice di astrobeed

BrainBooster:
fà la stesa cosa del codice di astrobeed

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

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?

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" ;

BrainBooster:
per quello potrebbe provare a spegnere la seriale alla fine del loop e riaccenderla all' con un Serial.end e un Serial.begin no?

La serial.begin non mi pare azzeri i puntatori del buffer, se non è cambiato qualcosa nell'ultima versione dell'IDE si limita a settare i registri macchina dell'UART per il baud rate richieste e ad attivarla.
La serial.end non ho mai controllato cosa fa esattamente pertanto no so se azzera i puntatori del buffer seriale, è da verificare, se lo fa diventa il sistema più semplice e rapido.

gingardu:
ci vuole un comando (a comando)

Non ti complicare inutilmente la vita, semplicemente svuoti la seriale un attimo prima del uso uso reale se hai il dubbio che potrebbe aver ricevuto nel frattempo dei byte che a te non servono.
Di solito non serve svuotare il buffer di ricezione della seriale perché in un sistema fatto bene c'è sempre un protocollo di comunicazione che previene gli errori e gli invii spuri, nulla di complicato, nei casi più semplici basta far precedere i dati utili da un carattere ben preciso ed univoco, solitamente si usa "@", e terminarli allo stesso modo con un carattere diverso, p.e. "#", tutto quello che arriva al di fuori di questo contesto è spazzatura e la butti via.
Se aggiungi un time out e un semplice cheksum sei ancora più tranquillo e riduci notevolmente le possibilità di errore.

void HardwareSerial::end()
{
  // wait for transmission of outgoing data
  while (_tx_buffer->head != _tx_buffer->tail)
    ;

  cbi(*_ucsrb, _rxen);
  cbi(*_ucsrb, _txen);
  cbi(*_ucsrb, _rxcie);  
  cbi(*_ucsrb, _udrie);
  
  // clear any received data
  _rx_buffer->head = _rx_buffer->tail;
}

:wink:

In pratica basta utilizzare solo questa riga di codice per azzerare il buffer di ricezione senza disattivare per forza la seriale.

// clear any received data
  _rx_buffer->head = _rx_buffer->tail;

Il codice non fa altro che porre allo stesso valore il puntatore della testa del buffer con quello della coda azzerando di fatto la disponibilità di byte non ancora letti.
Da verificare se è necessario fare qualche dichiarazione specifica per utilizzare all'interno dello sketch quei puntatori, molto probabilmente tocca ridichiararli come extern come per il reset da sketch della millis().

nell'header sono private

BrainBooster:
nell'header sono private

Vero, a questo punto si fa prima ad usare direttamente la serial.end seguita da una serial.begin, da un punto di vista cicli macchina richiede sicuramente meno tempo della while anche se il buffer è già vuoto.

che è più o meno quello che dicevo all'inizio :slight_smile:

BrainBooster:
per quello potrebbe provare a spegnere la seriale alla fine del loop e riaccenderla all' con un Serial.end e un Serial.begin no?

e se facesse un vichinghissimo

  UCSR0B &= ~(1<<TXEN0);  //disabilita TX   
  UCSR0B &= ~(1<<RXEN0);  //disabilita  RX   
  UCSR0B |= (1<<RXEN0);   //abilita RX 
  UCSR0B |= (1<<TXEN0);  //abilita TX

??
lo spegnimento di tx/rx dovrebbe azzerare il buffer

BrainBooster:
lo spegnimento di tx/rx dovrebbe azzerare il buffer

No perché è gestito a software tramite i due indici rx_buffer->head e _rx_buffer->tail, se non intervieni su questi il buffer rimane inalterato.

tiriammo le somme ]:smiley:
per noi niubbi la cosa piu veloce .... e questa?

if ( digitalRead (11)==LOW) serial.end ;

if ( digitalRead (11)==LOW) serial.begin (9600) ;

spenge e riaccende se un pin va basso

yess