Pages: [1]   Go Down
Author Topic: [RISOLTO] Problema con buffer della seriale (credo...)  (Read 1282 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 80
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
// 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?
« Last Edit: July 26, 2012, 12:23:10 am by Piero78 » Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

-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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 80
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 2
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
char c;
while(Serial.available() > 0)
{
c=Serial.read();
}
e pulivi il buffer manualmente
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7205
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puoi scriverlo anche tutto su una riga
Code:
while(Serial.available() > 0) char c=Serial.read(); // Svuota il buffer della Seriale
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Jr. Member
**
Karma: 0
Posts: 80
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie!
Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

forse son pignolo,ma scrivilo direttamente così

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

Pages: [1]   Go Up
Jump to: