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?
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.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.
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:
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.
Respostas:
No site do Arduino para Serial.write e Serial.print :
Serial.write ()
Serial.print ()
fonte
Serial.write é mais realista, é simples e rápido, é feito para falar binário, um byte de cada vez. exemplo:
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
mais exemplos com saída serial visual:
Código:
SAÍDA DE SÉRIE:
Código:
SAÍDA DE SÉRIE:
Serial.println (), por outro lado, adicionará o final da linha 2 bytes 0x0D e 0x0A, como você pode ver no quadro
Código:
SAÍDA DE SÉRIE:
fonte
Serial.write
envia bytes para a porta serial enquantoSerial.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.
fonte
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 comandoSerial.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:
(00110010 00110001 00110111)
Agora vamos olhar
Serial.print()
. Os comandosSerial.print(217)
ouSerial.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 comandoSerial.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 ...
fonte
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.
fonte