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

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

Resposta

Serial.write é mais pé no chão, é 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 para você de ASCII para binário ele também pode converter para BIN / HEX / OCT / DEC, mas você precisa especificar um segundo argumento como este

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 EM SÉRIE: insira a descrição da imagem aqui

Código:

 Serial.print("HELLO"); 

SAÍDA SERIAL: insira a descrição da imagem aqui

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

Código:

 Serial.println("HELLO"); 

SAÍDA SERIAL:

insira a descrição da imagem aqui

Resposta

Do 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.

Resposta

Serial.write envia bytes para a porta serial enquanto Serial.print envia caracteres ASCII para que as pessoas possam ler facilmente.

Alguns dispositivos funcionam 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 por meio da interface serial e então você pode interpretar indo cada byte.

Resposta

Todos os exemplos acima estão corretos, mas talvez mais claramente …. Todos os dados enviados pela porta serial são enviados como 1 “se 0” s. (óbvio … eu espero) … A diferença nos dois comandos é como tudo o que está sendo enviado é realmente traduzido / interpretado para / desses 1 “se 0” s. 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 “se 0” s) desse número é 11011001. Usando o comando Serial.write(217) irá literalmente enviar 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 que fica interessante … Se você fosse usar o comando Serial.write("217"), em vez disso obteria este: 00110010 00110001 00110111 … O QUÊ?!?!?
Quando uma string é passada como argumento, ela é 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, vejamos Serial.print(). Os comandos Serial.print(217) ou Serial.print("217") imprimirão a mesma coisa: 00110010 00110001 00110111. Isso ocorre porque o comando de impressão primeiro converte qualquer número em um string representação e, em seguida, usa o comando Serial.write() para enviar cada caractere como bits ASCII individuais.

Embora esta não seja uma descrição COMPLETA, espero que ajude você pensando na direção certa …

Resposta

Outra forma de responder a isso é declarar que o Serial.write aceita um único caracteres em que Serial.print aceita strings. Pode haver algumas diferenças, mas esta é a principal.

Comentários

  • E quanto a Serial.write(stringData.c_str());? se stringData é definido como String.
  • Por favor, mostre como stringData é definido como String.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *