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.


Come nell'esercizo precedente, 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 alcune spiegazioni.

In primo luogo si nota la definizione della funzione EseguiComandoSeriale() è fatta dopo la funzione loop() che la utilizza. La programmazione ANSI C non prevede questa possibilità, la definizione delle funzioni deve essere fatta infatti prima del suo utilizzo, però la programmazione tramite la IDE di Arduino non è ANSI C, quindi l'operazione è lecita.

La funzione EseguiComandoSeriale() 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.


Ultime modifiche: venerdì, 23 dicembre 2022, 11:37