Qual é a diferença entre Serial.write e Serial.print? E quando eles são usados?

26

Qual é a diferença entre Serial.write e Serial.print? E quando eles são usados?
Ambos foram usados ​​para imprimir no monitor serial, quais são as diferenças reais?

shadab
fonte
Excelente explicação bpinhosilva! Você me ajudou a entender algo com o qual eu estava lutando muito claramente agora.
Rory

Respostas:

19

No site do Arduino para Serial.write e Serial.print :

Serial.write ()

Grava dados binários na porta serial. Esses dados são enviados como um byte ou série de bytes; para enviar os caracteres que representam os dígitos de um número, use a função print ().

Serial.print ()

Imprime dados na porta serial como texto ASCII legível por humanos.

LoganBlades
fonte
17

Serial.write é mais realista, é simples e rápido, é feito para falar binário, um byte de cada vez. exemplo:

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

Serial.print, por outro lado, é mais versátil, ele fará a conversão de ASCII para binário e também pode converter em BIN / HEX / OCT / DEC, mas é necessário especificar um segundo argumento como esse

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" 

mais exemplos com saída serial visual:

Código:

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

SAÍDA DE SÉRIE: insira a descrição da imagem aqui

Código:

  Serial.print("HELLO");

SAÍDA DE SÉRIE: insira a descrição da imagem aqui

Serial.println (), por outro lado, adicionará o final da linha 2 bytes 0x0D e 0x0A, como você pode ver no quadro

Código:

  Serial.println("HELLO");

SAÍDA DE SÉRIE:

insira a descrição da imagem aqui

Nassim
fonte
7

Serial.writeenvia bytes para a porta serial enquanto Serial.printenvia caracteres ASCII para que as pessoas possam ler facilmente.

Alguns dispositivos trabalham usando bytes para definir configurações, geralmente usam pacotes de dados e você precisa usar a função de gravação para se comunicar com eles. Eventualmente, eles enviarão bytes através da interface serial e você poderá interpretar passando cada byte.

bpinhosilva
fonte
5

Todos os exemplos acima estão corretos, mas talvez mais claramente ... Todos os dados enviados pela porta serial são enviados como 1 e 0. (óbvio .... espero) ... A diferença nos dois comandos é como o que está sendo enviado é realmente traduzido / interpretado de / para esses 1 e 0. O exemplo mais claro envolve a transmissão de números.

Digamos que você precise enviar o número 217. A representação binária (1 e 0) desse número é 11011001. O uso do comando Serial.write(217)literalmente envia 11011001 através da linha. A representação hexadecimal do mesmo número é 0xD9 e o comando Serial.write(0xD9)enviará a mesma coisa ... 11011001.

Aqui é onde fica interessante ... Se você usasse o comando Serial.write("217"), obteria o seguinte: 00110010 00110001 00110111 ... O QUE?!?!?
Quando uma sequência é passada como argumento, é dividida em caracteres individuais, convertida em ASCII e enviada como um byte para cada caractere. Você obteria exatamente a mesma saída se usasse o seguinte:

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

(00110010 00110001 00110111)

Agora vamos olhar Serial.print(). Os comandos Serial.print(217)ou Serial.print("217")ambos imprimirão a mesma coisa: 00110010 00110001 00110111. Isso ocorre porque o comando print primeiro converte qualquer número em uma representação de sequência e, em seguida, usa o comando Serial.write()para enviar cada caractere como bits ASCII individuais.

Embora essa não seja uma descrição COMPLETA, espero que ajude você a pensar na direção certa ...

Jerimiah
fonte
3

Outra maneira de responder a isso é declarar que Serial.write aceita caracteres únicos, onde Serial.print aceita strings. Pode haver algumas diferenças, mas essa é a principal.

linhartr22
fonte