Go Down

Topic: [RISOLTO] Problema con buffer della seriale (credo...) (Read 1 time) previous topic - next topic

Piero78

Jul 25, 2012, 11:07 pm Last Edit: Jul 26, 2012, 07:23 am by Piero78 Reason: 1
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:

Code: [Select]
// 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?

m_ri

-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

Piero78

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.

m_ri

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

ale92

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
Code: [Select]

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

e pulivi il buffer manualmente

PaoloP

Puoi scriverlo anche tutto su una riga
Code: [Select]
while(Serial.available() > 0) char c=Serial.read(); // Svuota il buffer della Seriale
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP


m_ri

forse son pignolo,ma scrivilo direttamente così

Code: [Select]
while(Serial.available()) Serial.read()
dichiarare un char che viene disallocato a ogni ciclo è poco utile..

Go Up