Pages: [1]   Go Down
Author Topic: [Risolto] - Scartare valori in ricezione seriale  (Read 366 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 192
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!
« Last Edit: January 31, 2014, 02:45:16 pm by Hertz » Logged

Switzerland
Online Online
Faraday Member
**
Karma: 114
Posts: 5982
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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 smiley

Guglielmo
Logged

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

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 192
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si leggo il valore con:
Code:
Valore = Serial.read();
Poi eseguo il test (se il valore ricevuto equivale a X):
Code:
if (valore == 88)
Poi dovrei leggere i valori successivi, devo utilizzare un altro Serial.read(); e salvare questi valori in un altra variabile?
Code:
valore = Serial.read();
 if (valore == 88) {
   valoreNumerico = Serial.read();
   }
  else {
    // codice
    }
   
Così?
Logged

Switzerland
Online Online
Faraday Member
**
Karma: 114
Posts: 5982
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guglielmo
Logged

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

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 192
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Switzerland
Online Online
Faraday Member
**
Karma: 114
Posts: 5982
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
void loop() {
   ...
   ...
   if (Serial.available()) {
      val = Serial.read();
      if (val == valoreGiusto) {
         val = Serial.read();
         ...
         ...
      }
   }
   ...
   ...
}

Guglielmo
Logged

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

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 192
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho scritto questo ma non mi funziona: se invio Xvalore mi stampa sempre 255:
Code:
if (Serial.available()) {
     val = Serial.read();
      if (val == 65) {
        val = Serial.read();
        Serial.print(val, DEC);
          }
        }
      }
Poi ho provato con quest' altro codice:
Code:
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?
« Last Edit: January 26, 2014, 12:14:17 pm by Hertz » Logged

Switzerland
Online Online
Faraday Member
**
Karma: 114
Posts: 5982
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho scritto questo ma non mi funziona: se invio Xvalore mi stampa sempre 255:
Code:
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:
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
« Last Edit: January 26, 2014, 12:22:38 pm by gpb01 » Logged

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

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 192
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Switzerland
Online Online
Faraday Member
**
Karma: 114
Posts: 5982
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 192
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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
             }
          }
        }
      }
     
Logged

Switzerland
Online Online
Faraday Member
**
Karma: 114
Posts: 5982
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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

Guglielmo
Logged

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

Pages: [1]   Go Up
Jump to: