¿Cuál es la diferencia entre Serial.write y Serial.print? ¿Y cuando se usan?

¿Cuál es la diferencia entre Serial.write y Serial.print? ¿Y cuándo se utilizan?
Ambos se han utilizado para imprimir en un monitor de serie, ¿cuáles son sus diferencias reales?

Respuesta

Serial.write es más realista, es simple y rápido, está hecho para hablar en binario, un byte a la vez. ejemplo:

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

Serial.print por otro lado es más versátil, hará la conversión por usted de ASCII a binario y también puede convertir a BIN / HEX / OCT / DEC pero necesitas especificar un segundo argumento así

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" 

más ejemplos con salida visual en serie:

Código:

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

SALIDA EN SERIE: ingrese la descripción de la imagen aquí

Código:

 Serial.print("HELLO"); 

SALIDA EN SERIE: ingrese la descripción de la imagen aquí

Serial.println () en el otro lado agregará el final de la línea 2 bytes 0x0D y 0x0A como puede ver en el marco

Código:

 Serial.println("HELLO"); 

SALIDA SERIE:

ingrese la descripción de la imagen aquí

Respuesta

Desde el sitio de Arduino para Serial.write y Serial.print :

Serial.write ()

Escribe datos binarios en el puerto serie. Estos datos se envían como un byte o una serie de bytes; para enviar los caracteres que representan los dígitos de un número, utilice la función print () en su lugar.

Serial .print ()

Imprime datos en el puerto serie como texto ASCII legible por humanos.

Responder

Serial.write envía bytes al puerto serie mientras que Serial.print envía caracteres ASCII para que la gente pueda leer fácilmente.

Algunos dispositivos funcionan usando bytes para establecer configuraciones, comúnmente usan paquetes de datos y usted Necesito usar la función de escritura para comunicarse con ellos. Con el tiempo, enviarán bytes a través de la interfaz en serie y luego podrá interpretar cada byte.

Responder

Todos los ejemplos anteriores son correctos, pero tal vez más claramente … Todos los datos enviados a través del puerto serie se envían como 1 «sy 0» s. (obvio …. espero) … La diferencia en los dos comandos es cómo lo que se envía se traduce / interpreta realmente a / desde estos 1 «sy 0» s. El ejemplo más claro involucra la transmisión de números.

Digamos que necesita enviar el número 217. La representación binaria (1 «sy 0» s) de este número es 11011001. Usando el comando Serial.write(217) enviará literalmente 11011001 a través de la línea. La representación hexadecimal del mismo número es 0xD9, y el comando Serial.write(0xD9) enviará lo mismo … 11011001.

Aquí es donde se pone interesante … Si usaras el comando Serial.write("217") obtendrías esto: 00110010 00110001 00110111 … ¡¿¡QUÉ?!?!?
Cuando se pasa una cadena como argumento, se divide en caracteres individuales, se convierte a ASCII y luego se envía como un byte para cada carácter. Obtendría exactamente el mismo resultado si usara lo siguiente:

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

(00110010 00110001 00110111)

Ahora veamos Serial.print(). Los comandos Serial.print(217) o Serial.print("217") imprimirán lo mismo: 00110010 00110001 00110111. Esto se debe a que el comando de impresión primero convierte cualquier número en un representación de cadena y luego usa el comando Serial.write() para enviar cada carácter como bits ASCII individuales.

Aunque esta no es una descripción COMPLETA, espero que te ayude pensando en la dirección correcta …

Respuesta

Sin embargo, otra forma de responder a esto es decir que Serial.write acepta single caracteres donde Serial.print acepta cadenas. Puede haber algunas diferencias, pero esta es la principal.

Comentarios

  • ¿Qué pasa con Serial.write(stringData.c_str());? si stringData se define como String.
  • Muestre cómo se define stringData como String.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *