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?
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?
Respostas:
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.
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
Código:
Serial.print("HELLO");
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:
Serial.write
envia bytes para a porta serial enquanto Serial.print
envia 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.
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 ...
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.