Arduino Nano 33 IoT

En nuestro blog de Joober hemos estado hablando de la comunicación «serie» . Sin embargo es necesario profundizar en el tema si deseamos un control de muchos de los aspectos que no tocamos en los otros post. Una de las cosas que nos podemos preguntar es que diferencia hay entre el Serial.print() o Serial.println() y el Serial.write().

CONCEPTOS PREVIOS

Lo primero que hay que saber es que existe un código de caracteres basado en el alfabeto latino llamado ASCII en el que un número decimal del 0 al 255 se corresponde con un carácter. Por ejemplo, el número 87 se corresponde a la letra «W».

También se puede entrar en la tabla con un valor hexadecimal. Por ejemplo, el valor 64h se corresponde al carácter «d».

SERIAL.WRITE()

Para ver las diferencias, lo mejor es probar a ver que sucede en los distintos casos. Para ello, introduciremos dentro de los paréntesis de la función Serial.write y Serial.print, valores, caracteres y cadenas de texto. Esto de introducir algo dentro de una función se denomina técnicamente introducir un argumento.

Argumento: un entero

Serial.write(84);

Lo que veríamos por el monitor serie es la letra «T». Es decir, convierte el valor entero 84 en la letra «T». Por lo tanto:

1. El Serial.write convierte los valores enteros en caracteres de ASCII.

La diferencia clave es que el Serial.write() manda un único valor en formato ASCII . En cambio, el Serial.Print() divide el 84, por un 8 y un 4. Primero manda el 8 en formato ASCII, luego el 4 en su equivalente también en ASCII. Cuando llega al monitor serie, reconvierte cada uno de los datos en ASCII a decimal formando el valor 84. Por lo tanto, al enviar un valor entero con el Serial.write() lo que enviaremos será un único valor en formato ASCII.

Argumento: Carácter o String

A continuación, podemos hacernos la siguiente pregunta. ¿Qué sucede si en vez de mandar el entero 84, se lo mandamos en formato String? Vamos a comprobarlo:

Serial.write("84");
Serial.write("Hola Joober");

Y, ¿si le enviamos un carácter?

Serial.write('B');

Si hacemos esto, por el monitor serie veremos el valor 84, hola Joober y la letra B. Por lo que llegamos a la conclusión que:

2. El Serial.write no modifica los strings o caracteres, por lo que no los convierte en su equivalente en ASCII.

Argumento: un hexadecimal

La siguiente pregunta es, ¿qué pasaría si enviamos un hexadecimal? Pues vamos a probarlo con el 0x49. Veamos:

Serial.write(0x49);

Pus lo que veríamos sería la letra «I». es decir, convierte el hexadecimal en su equivalente en ASCII.

3. El Serial.write convierte el hexadecimal en su equivalente en ASCII.

Por lo que llegamos a la conclusión que el Serial.write() hace tres cosas, convierte los enteros y hexadecimales en su equivalente en ASCII y no modifica los strings o caracteres.

SERIAL.PRINT()

Acabamos de ver que el Serial.write, transforma los argumentos a su equivalente en ASCII o los mantiene en caso de los Strings o caracteres. Sin embargo, lo que hace el serial.print() o Serial.println() es:

4. Cuando el argumento sea un String o un carácter (char) se mantiene, pero si el argumento es un entero, float o double, los convierte en Strings.

  • Serial.print(89) devuelve "89"
  • Serial.print(3.4569) devuelve "3.4569"
  • Serial.print('Z') devuelve "Z"
  • Serial.print("Joober me gusta") devuelve "Joober me gusta"

También podemos imprimir los valores en distintos formatos (binario, hexadecimal, decimal, etc.):

  • Serial.print(89, BIN) devuelve "1011001"
  • Serial.print(89, OCT) devuelve "131"
  • Serial.print(89, DEC) devuelve "89"
  • Serial.print(89, HEX) devuelve "41"
  • Serial.println(2.3458, 0) devuelve "2"
  • Serial.println(2.3458, 2) devuelve "2.34"
  • Serial.println(2.3458, 4) devuelve "2.3458"

EL SERIAL.PRINTLN()

El Serial.println() tiene las mismas funciones que el Serial.print() pero añade un salto de línea al final. Es decir, imaginemos que deseamos ver el valor 53 en el monitor serie. Cómo hemos explicado escribiríamos Serial.print(53). Sin embargo en la pantalla veríamos el valor de forma confusa: 5353535353535353535353535353…..

Para poderlo visualizar de forma separada y una línea tras otra, añadimos el prefijo «ln». Arduino para hacer este salto de línea, añade 2 bytes 0x0D y el 0x0A.

Almacenamiento de datos

Finalmente la forma en que guardamos una variable, puede inducir a error. Una cosa es escribir algo dentro del paréntesis (el argumento) y la otra es la forma que almacenamos el dato. Es decir, imaginemos lo siguiente:

   byte x = 'A';
   Serial.write(x);
   Serial.println(x); 

No vayamos a pensar que Serial.println() es A. Lo que sucede es que al hacer byte x = ‘A’, Arduino almacena su equivalente en ASCII. Entonces, el Serial.print() lo muestra tal cual, es decir, el valor 65 y el serial.write muestra A. Exactamente igual que lo que hemos explicado. En otras palabras, lo que sucede es que byte x = ‘A’, equivale a decir que x = 65.

Sin embargo si hacemos esto:

   byte x = '65';
   Serial.println(x); 

Lo que veremos es que el monitor serie mostrará el valor 53. Es decir, mostrará el «octal» de 65. Por lo que, en resumen:

byte x = 'A'
Serial.write(x); //devuelve el carácter A
Serial.print(x); //devuelve su equivalente en ASCII -- 65

byte y = '65'
Serial.write(y); //devuelve el carácter en ASCII A
Serial.print(y); //devuelve su octal es decir -- 53 

Para más información consultar en la web de Arduino.

Leave a Comment

Your email address will not be published. Required fields are marked *

Información básica sobre protección de datos
Responsable Francisco de Asís Benavente Delgado +info...
Finalidad Gestionar y moderar tus comentarios. +info...
Legitimación Consentimiento del interesado. +info...
Destinatarios No se cederán datos a terceros, salvo obligación legal +info...
Derechos Acceder, rectificar y cancelar los datos, así como otros derechos. +info...
Información adicional Puedes consultar la información adicional y detallada sobre protección de datos en nuestra página de política de privacidad.