Qual è la differenza tra Serial.write e Serial.print? E quando vengono usati?


26

Qual è la differenza tra Serial.write e Serial.print? E quando vengono usati?
Entrambi sono stati usati per stampare su monitor seriale, quali sono le loro effettive differenze?


Ottima spiegazione bpinhosilva! Mi hai aiutato a capire qualcosa con cui stavo lottando molto chiaramente ora.
Rory,

Risposte:


19

Dal sito Arduino per Serial.write e Serial.print :

Serial.write ()

Scrive dati binari sulla porta seriale. Questi dati vengono inviati come byte o serie di byte; per inviare i caratteri che rappresentano le cifre di un numero utilizzare invece la funzione print ().

Serial.print ()

Stampa i dati sulla porta seriale come testo ASCII leggibile dall'uomo.


17

Serial.write è più semplice, è semplice e veloce, è fatto per parlare binario, un byte alla volta. esempio:

Serial.write(0x45);   // will write 0100 0101 to the cable

Serial.print invece è più versatile, farà la conversione per te da ASCII a binario e può anche convertirsi in BIN / HEX / OCT / DEC ma devi specificare un secondo argomento in questo modo

Serial.print(76, BIN) gives "0100 1100"
Serial.print(76, OCT) gives "114"
Serial.print("L", DEC) gives "76"
Serial.print(76, HEX) gives "4C" 

altri esempi con output seriale visivo:

Codice:

  Serial.write(0x48);   // H
  Serial.write(0x45);   // E
  Serial.write(0x4C);   // L
  Serial.write(0x4C);   // L
  Serial.write(0x4F);   // O

USCITA SERIALE: inserisci qui la descrizione dell'immagine

Codice:

  Serial.print("HELLO");

USCITA SERIALE: inserisci qui la descrizione dell'immagine

Serial.println () invece aggiungerà fine riga 2 byte 0x0D e 0x0A come puoi vedere nel frame

Codice:

  Serial.println("HELLO");

USCITA SERIALE:

inserisci qui la descrizione dell'immagine


7

Serial.writeinvia byte alla porta seriale mentre Serial.printinvia caratteri ASCII in modo che le persone possano leggere facilmente.

Alcuni dispositivi funzionano utilizzando i byte per impostare le configurazioni, utilizzano comunemente pacchetti di dati e per comunicare con essi è necessario utilizzare la funzione di scrittura. Alla fine invieranno byte tramite l'interfaccia seriale e quindi potrai interpretare andando su ogni byte.


5

Tutti gli esempi sopra riportati sono corretti, ma forse più chiaramente .... Tutti i dati inviati tramite la porta seriale vengono inviati come 1 e 0. (ovvio .... spero) ... La differenza tra i due comandi è come tutto ciò che viene inviato viene effettivamente tradotto / interpretato a / da questi 1 e 0. L'esempio più chiaro riguarda la trasmissione di numeri.

Supponiamo che tu debba inviare il numero 217. La rappresentazione binaria (1 e 0) di questo numero è 11011001. L'uso del comando Serial.write(217)invierà letteralmente 11011001 attraverso la linea. La rappresentazione esadecimale dello stesso numero è 0xD9 e il comando Serial.write(0xD9)invierà la stessa cosa ... 11011001.

Qui è dove diventa interessante ... Se dovessi usare il comando Serial.write("217")dovresti invece ottenere questo: 00110010 00110001 00110111 ... CHE COSA?!?!?
Quando una stringa viene passata come argomento, viene suddivisa in singoli caratteri, convertita in ASCII e quindi inviata come byte per ciascun carattere. Otterresti lo stesso identico output se dovessi utilizzare quanto segue:

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

(00110010 00110001 00110111)

Ora diamo un'occhiata Serial.print(). I comandi Serial.print(217)o Serial.print("217")stamperanno entrambi la stessa cosa: 00110010 00110001 00110111. Questo perché il comando di stampa converte prima qualsiasi numero in una rappresentazione di stringa e quindi utilizza il comando Serial.write()per inviare ciascun carattere come singoli bit ASCII.

Anche se questa non è una descrizione COMPLETA, spero che ti aiuti a pensare nella giusta direzione ...


3

Un altro modo per rispondere a questo è affermare che Serial.write accetta caratteri singoli in cui Serial.print accetta stringhe. Potrebbero esserci delle differenze, ma questa è la principale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.