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.
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
Buon coding a tutti 🙂