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

26

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

shadab
fuente
Excelente explicación bpinhosilva! Me ayudaste a entender algo con lo que había estado luchando muy claramente ahora.
Rory

Respuestas:

19

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 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 para humanos.

LoganBlades
fuente
17

Serial.write es más realista, es simple y rápido, está hecho para hablar 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, también puede convertir a BIN / HEX / OCT / DEC, pero debe 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 serial visual:

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 EN SERIE:

ingrese la descripción de la imagen aquí

Nassim
fuente
7

Serial.writeenvía bytes al puerto serie mientras Serial.printenvía caracteres ASCII para que las personas puedan leer fácilmente.

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

bpinhosilva
fuente
5

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 y 0. (obvio ... espero) ... La diferencia en los dos comandos es cómo lo que se envía se traduce / interpreta realmente a / desde estos 1's y 0's. El ejemplo más claro implica la transmisión de números.

Digamos que necesita enviar el número 217. La representación binaria (1 y 0) de este número es 11011001. El uso del 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 usara el comando, en Serial.write("217")su lugar obtendría 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 la misma salida si usara lo siguiente:

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

(00110010 00110001 00110111)

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

Aunque esta no es una descripción COMPLETA, espero que te ayude a pensar en la dirección correcta ...

Jerimiah
fuente
3

Otra forma de responder esto es declarar que Serial.write acepta caracteres individuales donde Serial.print acepta cadenas. Puede haber algunas diferencias, pero esta es la principal.

linhartr22
fuente