
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 🙂