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.

Risultati immagini per arduino blink

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 EseguiComandoSerialeuovo che viene richiamata ogni volta che la funzione Serial.availableuovo restituisce un valore maggiore di 0.

Nota: la funzione Serial.availableuovo 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 EseguiComandoSerialeuovo 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.


Ultime modifiche: lunedì, 21 marzo 2022, 16:57