Go Down

Topic: [Risolto] - Scartare valori in ricezione seriale (Read 423 times) previous topic - next topic

Hertz

Jan 26, 2014, 05:13 pm Last Edit: Jan 31, 2014, 08:45 pm by Hertz Reason: 1
Avrei la necessità di creare un programmino che quando incontra un dato valore in ingresso sulla seriale lo scarti e continui a leggere il resto dei valori in entrata.
Per fare questo avrei pensato di utilizzare un if che esegue un test del tipo:

CASO 1 - Stai leggendo X allora togli X e leggi il resto;
CASO 2- Non stai leggendo X allora non fare niente;

Ora per il test non ci sono problemi solo che non so come fargli ignorare la X e leggere il resto, qualcuno potrebbe spiegarmi come si fa?
Grazie in anticipo per le risposte!!

gpb01

Ciao,
suppongo che tu legga dalla seriale con uno statement del tipo :

Code: [Select]
mioValore = Serial.read();

In tal caso se il carattere ricevuto è quello di tuo interesse lo gestirai e magari lo salverai da qualche parte, altrimenti semplicemente leggerai il prossimo carattere che andrà a sovrascrivere il precedente :)

Guglielmo
Search is Your friend ... or I am Your enemy !

Hertz

Si leggo il valore con:
Code: [Select]
Valore = Serial.read();
Poi eseguo il test (se il valore ricevuto equivale a X):
Code: [Select]
if (valore == 88)
Poi dovrei leggere i valori successivi, devo utilizzare un altro Serial.read(); e salvare questi valori in un altra variabile?
Code: [Select]

valore = Serial.read();
if (valore == 88) {
   valoreNumerico = Serial.read();
   }
  else {
    // codice
    }
   

Così?

gpb01

Non ho capito ...
... tu devi aspettare di ricevere UN determinato carattere e poi, da quel momento ... quanti altri ne devi ricevere ???

Guglielmo
Search is Your friend ... or I am Your enemy !

Hertz

Devo ricevere un valore, mi spiego meglio:
Se dal serial monitor digito Xvalore lui mi deve riconoscere che ha incontrato X, scartarla e leggere solo il valore che la segue; Se invece scrivessi Wvalore lui mi dovrebbe riconoscere che non è X e scartare sia il carattere di riconoscimento che il valore che lo segue.

gpb01

Ok, allora è come avevi fatto tu ... eliminando la parte "else" ... tanto se non è quello che ti aspetti, deve tornare a leggere finché non lo riceve ... qualche cosa del tipo :

Code: [Select]
void loop() {
   ...
   ...
   if (Serial.available()) {
      val = Serial.read();
      if (val == valoreGiusto) {
         val = Serial.read();
         ...
         ...
      }
   }
   ...
   ...
}


Guglielmo
Search is Your friend ... or I am Your enemy !

Hertz

#6
Jan 26, 2014, 06:08 pm Last Edit: Jan 26, 2014, 06:14 pm by Hertz Reason: 1
Ho scritto questo ma non mi funziona: se invio Xvalore mi stampa sempre 255:
Code: [Select]
if (Serial.available()) {
    val = Serial.read();
     if (val == 65) {
       val = Serial.read();
       Serial.print(val, DEC);
         }
       }
     }

Poi ho provato con quest' altro codice:
Code: [Select]
if (Serial.available()) {
    val = Serial.read();
     if (val == 65) {
       val = Serial.read()-48;
       if ((val >=48) && (val <= 57)) {
       Serial.print(val, DEC);
         }
       }
     }
   }

rispetto al codice precedente questo controlla che il valore dopo a X sia un numero.
Ma invece di visualizzarmi "valore" sul serial monitor non mi visualizza niente come mai?

gpb01

#7
Jan 26, 2014, 06:21 pm Last Edit: Jan 26, 2014, 06:22 pm by gpb01 Reason: 1

Ho scritto questo ma non mi funziona: se invio Xvalore mi stampa sempre 255:
Code: [Select]
if (Serial.available()) {
    val = Serial.read();
     if (val == 65) {
       val = Serial.read();
       Serial.print(val, DEC);
         }
       }
     }

  ...


Purtroppo lo sospettavo ... il codice Arduino è più veloce dell'arrivo dei caratteri sulla seriale e ... letto il primo, il secondo non è ancora arrivato ...

Code: [Select]

if (Serial.available()) {
  val = Serial.read();
  if (val == 65) {
     Serial.println("Ricevuto carattere di inizio");
     while ( ! Serial.available()) {}
     val = Serial.read();
     Serial.println(val, DEC);
  }
}


... in pratica il codice così, dopo aver ricevuto il carattere di inizio entra in un loop vuoto (che in pratica non fa nulla) dal quale esce solo se c'è un carattere disponibile da leggere.

Guglielmo
Search is Your friend ... or I am Your enemy !

Hertz

In questo modo però mi legge solo un carattere cioè riconosce X e poi legge solo il primo byte:
Ad esempio X100 nel debug mi da Ricevuto carattere di inizio: 49
Come potrei ovviare a questo problema?

gpb01

Ah beh ... se devi ricevere più di un carattere allora tocca che complichi tutta la logica inserendo anche non solo il carattere di inizio dati validi (che ti consiglio di mettere al valore standard di STX = 0x02), ma anche un carattere di fine dati validi (che ti consiglio di mettere al valore standard di ETX = 0x03) così da ...

1. Attendere il carattere STX
2. attendere e leggere il carattere successivo
2.1 se esso è ETX si è finito
2.2 se esso NON è ETX allora occorre continuare a leggere

... in questo modo non sei legato ad una lunghezza fissa di ciò che devi trasmettere.

Guglielmo
Search is Your friend ... or I am Your enemy !

Hertz

Scusa l' ignoranza ma come faccio a  farlo smettere di leggere?

Code: [Select]

if (Serial.available()) {
     val = Serial.read();
      if (val == 02) {
       Serial.print("Inizio ricezione");
        val = Serial.read();
        Serial.print(val, DEC);
      if (val == 03) {
           // End of text
             }
          }
        }
      }
     

gpb01

Mmmm ....
... ho idea che ti devi studiare i loop in C e, in particolare, l'uso dell'istruzione while nonché dell'istruzione break ... dato che quello che dovrai fare sono cicli ripetitivi da interrompere al verificarsi di una data situazione ;)

Solo con gli if non ne puoi uscire ... devi necessariamente creare dei loop uno dentro l'altro per gestire le varie fasi ...

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up