[RISOLTO] Problema con buffer della seriale (credo...)

Ciao, ho un problema, in pratica dovrei passare un valore alla scheda tramite seriale, e in base a questo valore l'azione dovrebbe essere compiuta SOLO QUANDO VIENE INVIATO TALE VALORE, di seguito trovate il codice dello sketch:

// Variabili per il controllo dei motori
int E1 = 5; // Velocità motori a sinistra
int E2 = 6; // Velocità motori a destra
int M1 = 4; // Direzione motori a sinistra
int M2 = 7; // Direzione motori e destra

void sinistra(char a, char b) // Mando il rover a sinistra
{
  analogWrite(E1,a); // Muovo i motori di sinistra passndo la velocità "a"
  digitalWrite(M1,LOW); // La direzione dei motori di sinistra è "indietro"
  analogWrite(E2,b); // Muovo i motori di destra passando la velocità "b"
  digitalWrite(M2,HIGH); // La direzione dei motori di destra è "avanti"
}

void fermi(void) // Fermo il rover
{
  digitalWrite(E1,LOW); // Motori a sinistra fermi
  digitalWrite(E2,LOW); // Motori a destra fermi
}

void setup(void)
{
  Serial.begin(9600); // Avvio la comunicazione seriale 19200
  
  // Configuro i pin: 4, 5, 6 e 7 in output
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop(void)
{
  if (Serial.available()) // Leggo dalla porta seriale
  {
    char valore = Serial.read(); // Leggo il valore passato
    if (valore != -1)
    {
       switch (valore) // Controllo il valore letto
       {
         case 'z':
           sinistra(255, 255);
           delay(3000);
           fermi();
           delay(5000);
          break;
        }
     }
     Serial.flush();
  }   
}

In pratica l'azione dovrebbe essere eseguita solo quando invio "z" sulla porta seriale, il problema sta nel fatto che l'azione viene eseguita a ciclo continuo. Ho pensato che fosse perchè ad ogni giro viene letto il buffer della seriale e vi rimane il valore "z", così ho aggiunto l'istruzione Serial.flush() per ripulirlo, ma a quanto pare non funziona.
Qualche suggerimento?

-se al posto dello switch usassi un if funge?

-a occhio,direi che il controllo valore!=-1 puoi farlo se e solo se dichiari valore come int..se non ricordo male,la read restituisce un int

Allora, ho appurato una cosa.
Passando il valore "z" tramite il Serial Monitor dell'IDE, il codice postato funziona.

Il fatto è che comunico tramite un modulo bluetooth utilizzando un programma in C# scritto da me, quindi supponendo che a questo punto il problema fosse legato al contenuto del buffer in output dal PC, ho utilizzato il metodo SerialPort.DiscardOutBuffer ed una volta ripulito il buffer ho risolto il problema.

benissimo..allora metti un bel [risolto]al titolo del topic e siamo a posto :slight_smile:

giusto per informazione, il Serial.flush è cambiato con arduino 1.0 ecco perchè non ti funzionava...se volevi pulire il buffer da arduino dovevi farti una funzione tipo

char c;
while(Serial.available() > 0)
{
c=Serial.read();
}

e pulivi il buffer manualmente

Puoi scriverlo anche tutto su una riga

while(Serial.available() > 0) char c=Serial.read(); // Svuota il buffer della Seriale

Grazie!

forse son pignolo,ma scrivilo direttamente così

while(Serial.available()) Serial.read()

dichiarare un char che viene disallocato a ogni ciclo è poco utile..