Lettura e interpretazione di dati inviati ad Arduino tramite seriale

Quest'esercitazione prevede che abbia già un po' di familiarità con la porta seriale.


Nel caso specifico si vuole comandare l'accensione e lo spegnimento di led posizionato sul piedino 13 scrivendo rispettivamente "1" e "0" sulla prima riga del monitor seriale premendo poi il tasto "Send" o "Invia" a seconda della lingua impostata.

N.B. È necessario disattivare l'inserimento dei caratteri di fine riga che vengono inviati quando alla fine dell'inserimento viene premuto il tasto "invio".

Lo sketch da caricare è il seguente:

#define ledpin 13

void setup() {
  // initializza la communicatione seriale a 9600 bit per secondo
  Serial.begin(9600);
  
  pinMode(ledpin, OUTPUT);
}

void loop() {
  if (Serial.available() > 0){
    char inputByte = Serial.read();
    while (Serial.available() > 0) Serial.read();  // svuoto buffer
    switch (inputByte){
      case '1':     // se in seriale c'è "1" accendo il led
            digitalWrite(ledpin, HIGH);
            Serial.println("Led acceso");
            break;
      case '0':    // se in seriale c'è "0" spengo il led
            digitalWrite(ledpin, LOW);
            Serial.println("Led spento");            
            break;       
      default:            
            Serial.println("Comando errato");
    }  
  } 
} 

La funzione Serial.available() restituisce il numero di caratteri presenti nel buffer di ricezione della porta seriale di Arduino, quindo ogni volta che la funzione Serial.available() restituisce un valore maggiore di 0, c'è almeno un carattere pronto per essere letto.

Nel resto del codice le righe significative sono

char inputByte = Serial.read();

che ha l'effetto di caricare nella variabile inputByte (della dimensione di 1 carattere pari a 8 bit) il primo valore presente nel buffer di ricezione della porta seriale.

Nota: Un buffer è una zona di memoria usata per compensare differenze di velocità nel trasferimento o nella trasmissione di dati.

La successiva linea di codice:

while (Serial.available() > 0) Serial.read();

ha l'effetto di svuotare il buffer di ricezione nel caso di invii multipli di dati tramite il terminale di controllo.

Per finire il comando switch ha il compito di interpretare i dati che arrivano e svolgere le operazioni necessarie.


Ultime modifiche: lunedì, 27 febbraio 2023, 22:14