Lettura e scrittura di dati in seriale con l'uso delle funzioni
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 // the setup function runs once when you press reset or power the board void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); pinMode(ledpin, OUTPUT); } // the loop function runs over and over again forever void loop() { if (Serial.available() > 0){ EseguiComandoSeriale(); } } // funzioni void EseguiComandoSeriale(){ 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");
} }
Il listato merita qualche spiegazione.
In primo luogo si nota che la gestione dei dati in arrivo dalla seriale viene eseguita dalla funzione EseguiComandoSeriale( ) che viene richiamata ogni volta che la funzione Serial.available( ) restituisce un valore maggiore di 0.
Nota: la funzione Serial.available( ) restituisce il numero di caratteri presenti nel buffer di ricezione della porta seriale di Arduino.
Qualora vi sia un dato in seriale viene eseguita la funzione di controllo EseguiComandoSeriale( ) nella quale la prima riga è:
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.