Arduino: Qual è la differenza tra Serial.write() e Serial.print() e quando vengono usati?

Ho già trattato l’argomento sull’uso di Serial.write() e Serial.print(), però durante le lezioni svolte agli studenti negli scorsi mesi ho aggiunto alle lezioni alcuni contenuti che vi condivido.

Differenza tra Serial.write() e Serial.print()

Serial.write()

La funzione scrive dati binari sulla porta seriale. I dati vengono inviati come byte o serie di byte. Nel caso si abbia la necessità di inviare i caratteri che rappresentano le cifre di un numero bisogna utilizzare la funzione Serial.print().

Serial.print()

Stampa i dati sulla porta seriale come testo ASCII leggibile dagli esseri umani.

Quindi se scriviamo:

Serial.write(0x45); // invia sulla seriale 0100 0101

Serial.print() è più versatile, farà per noi la conversione da ASCII a binario e può anche convertire in binario (BIN), esadecimale (HEX), ottale (OCT), decimale (DEC) ma bisogna specificare come secondo argomento la codifica:

Serial.print(67, BIN) resituisce "1000 0011"
Serial.print(67, OCT) resituisce "103"
Serial.print('M', DEC) resituisce "77"
Serial.print(67, HEX) resituisce "43"

Questo il codice di test:

void setup() {
  Serial.begin(9600);

  Serial.println(67, BIN);   // resituisce "1000 0011"
  Serial.println(67, OCT);   // resituisce "103"
  Serial.println('M', DEC);  // resituisce "77"
  Serial.println(67, HEX);   // resituisce "43"
}

void loop() {

  // per ora nulla :-)

}

Altro esempio:

Serial.write(0x41);   // A
Serial.write(0x52);   // R
Serial.write(0x44);   // D
Serial.write(0x55);   // U
Serial.write(0x49);   // I
Serial.write(0x4E);   // N
Serial.write(0x4F);   // O

Questo il codice di test:

void setup() {
  Serial.begin(9600);

  Serial.write(0x41);   // A
  Serial.write(0x52);   // R
  Serial.write(0x44);   // D
  Serial.write(0x55);   // U
  Serial.write(0x49);   // I
  Serial.write(0x4E);   // N
  Serial.write(0x4F);   // O
}

void loop() {
  
  // per ora nulla :-)

}

In modo più rapido con la Serial.print() si ottiene il medesimo risultato:

Serial.print("ARDUINO");

Questo il codice di test:

void setup() {
  Serial.begin(9600);

  Serial.print("ARDUINO");
}

void loop() {

  // per ora nulla :-)

}

Serial.println() aggiungerà 2 byte di fine riga 0x0D e 0x0A:

Serial.println("ARDUINO");

che permette la stampa del contenuto tra virgolette con l’aggiunta di una nuova linea. Per mostrare l’inserimento di una nuova linea, aggiungiamo la stampa del carattere “-“:

void setup() {
  Serial.begin(9600);

  Serial.println("ARDUINO");
  Serial.print("-");
}

void loop() {

  // per ora nulla :-)

}

Stesso risultate si ottiene se aggiungiamo manualmente con una Serial.write() i caratteri di fine riga: 0x0D e 0x0A:

void setup() {
  Serial.begin(9600);

  Serial.print("ARDUINO");
  Serial.write(0x0D);
  Serial.write(0x0A);
  Serial.print("-");
}

void loop() {

  // per ora nulla :-)

}

Provo a chiarire l’utilizzo della Serial.write con la trasmissione di numeri sulla seriale.

Supponiamo di dover inviare sulla seriale il numero 243. La rappresentazione binaria (in 1 e 0) di questo numero è 1111 0011. L’uso del comando Serial.write(243) invierà letteralmente solo 1111 0011. La rappresentazione esadecimale dello stesso numero è 0xF3 e il comando Serial.write(0xF3) invierà la stessa cosa: 1111 0011.

Se dovessimo usare il comando Serial.write(“243”) si avrebbe:

00110010 00110100 00110011

Cosa che può apparire molto strana.

Quando una stringa viene passata come argomento viene suddivisa in singoli caratteri, convertita in ASCII e quindi inviata come byte per ogni carattere.

Si otterrebbe lo stesso risultato se si dovesse usare quanto segue:

Serial.write(50);
Serial.write(52);
Serial.write(51);

In binario: 00110010 00110100 00110011

Vediamo ora cosa succede con la Serial.print().

I comandi Serial.print(243) o Serial.print (“243”) stamperanno entrambi la stessa cosa: 00110010 00110100 00110011. Questo perché il comando print prima converte qualsiasi numero in una rappresentazione di stringa e poi usa il comando Serial.write() per inviare ogni carattere come singoli bit ASCII.

Buon coding a tutti 🙂

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.