Arduino Serial Print en 5
minutos
La función de Arduino Serial print y println, permiten escribir caracteres ascii en el puerto Serial.
La función serial es una de las más usadas Arduino. Entonces, el puerto serial es un dispositivo
electrónico digital que permite enviar y recibir datos binarios. Esta trancepción utiliza sólo dos
lineas de comunicación, llamadas RX y TX. El lenguaje de Arduino incorpora la capacidad de enviar
y recibir mensajes por el puerto Serial usando a las funciones print, println, write y read.
La función print requiere de caracteres ascii como parámetros de entrada. Un carácter ascii es una
codificación binaria que permite representar caracteres occidentales mediante un arreglo de 8 bits.
Para representar a estos caracteres, estos tienen que encontrarse entre doble comillas. Por
ejemplo, «Hola Mundo». Este mensaje requeriría de 10 bytes de información binaria para
transferirse por el puerto Serial. Si recordamos que para cada paquete se tiene que agregar 1 bit
de inicio y uno de paro.
Serial.print( );
Si te interesa conocer más sobre el protocolo Serial, dale click al enlace: puerto Serial.
Entonces, por ejemplo, consideremos la transmisión:
Serial.print("Hola Mundo");
SerialPrint1.ino hosted with ❤ by GitHub view raw
Para esta cadena de caracteres, se requieren 100 bits para transmitir a través de la función print y
el pin TX del puerto serial Arduino. Si la velocidad esta configurada a 9600 bits/s le tomara 10.41
ms transmitir esa información a Arduino serial print. El siguiente ejemplo muestra distintas
modificaciones de la instrucción print. Cabe mencionar que para proporcionar una mejor lectura a
la salida del ejemplo se usa la impresión del carácter «salto de linea». Este carácter esta
representado por \n. Una alternativa es usar, cuando se requiera, la modificación println.
Ejemplos de Arduino Serial
print
int temperaturaInt = 0;
double temperaturaReal = 0.0;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Hola Mundo \n");
Serial.print("\t HeTPro/Tutoriales \t");
Serial.print('\n');
Serial.print(123456789);
Serial.print('\n');
Serial.print(330.123456789);
Serial.print('\n');
Serial.print('A');
Serial.print('\n');
//Lectura del valor entero del ADC
//Rango: (0-1023)
temperaturaInt = analogRead(A0);
temperaturaReal = 5*temperaturaInt/1023;
Serial.print("El voltaje en A0 es: ");
Serial.print(temperaturaReal); //Todos los decimales
Serial.print('\n');
Serial.print(temperaturaReal,1); //1 los decimales
Serial.print('\n');
Serial.print("El voltaje en numero entero de A0 es ");
Serial.print(temperaturaInt);
Serial.print('\n');
Serial.print("El voltaje en numero entero HEXADECIMAL de A0 es ");
Serial.print(temperaturaInt,HEX);
Serial.print('\n');
Serial.print("El voltaje en numero entero BINARIO de A0 es ");
Serial.print(temperaturaInt,BIN);
Serial.print('\n');
while(1);
SerialPrint3.ino hosted with ❤ by GitHub view raw
¿ Qué es mejor, transmitir
Byte brutos o caracteres
ascii?
Por ejemplo, considere el caso del siguiente programa:
int temperatura = 0;
void setup(){
Serial.begin(9600);
}
void loop(){
temperatura = analogRead(A0);
//Ejemplo # 1
//Transmision de caracteres, se imprimira "1023" como valor maximo
Serial.print(temperatura);
//Ejemplo # 2
Serial.write(temperatura);
Serial.write(temperatura>>8);
//Alto al programa, el programa ya no continuara con esta linea.
while(1);
SerialPrint2.ino hosted with ❤ by GitHub view raw
En este programa se presentan las dos opciones de impresión Serial con Arduino. La primera
transmisión imprime caracteres y la segunda imprime bytes brutos. La Figura-1, muestra la
imagen resultante del monitor serial para el código de ejemplo 1 para el arduino serial print con las
dos opciones. De primera vista, parece que el ejemplo dos esta imprimiendo errores, pero si
analizáramos con un monitor serial distinto a Arduino, uno que pueda ver bytes, otra cosa seria.
Figura-1. Resultado del monitor serial al ejecutar el código-1.
Por ejemplo, analicemos el código. Una variable cuyo valor máximo es 1023 (valor máximo entero
del ADC de Arduino), cabe en 16 bits. Entonces si convirtiéramos el valor entero a hexadecimal,
1023 seria: 0x03FF. En cambio, 1023 convertidor a caracteres ascii seria: 0x31303233. En otras
palabras, enviar caracteres ascii toma mas » ancho de banda » del puerto serial. Esto es, al
requerir 1-byte por cada carácter, esta transmisión requiere de 4-bytes mientras que enviar el dato
bruto (valor entero), sólo se necesitan 2-bytes. Entonces ¿ qué es mejor ?, enviar bytes brutos o
caracteres?, bueno dependerá de la aplicación y el software o modulo que este recibiendo la
información binaria.
Por ejemplo, si queremos usar a la instrucción de Arduino serial print, para comunicarnos con el
módulo wifi-esp8266ex, este requiere comandos AT, es decir palabras formadas con caracteres
ascii. Sin embargo, si queremos graficar en Matlab el canal analógico 0, seria mejor tener mas
muestras por segundo de la información que nos interesa y podemos ser mas eficientes al usar a
la función write.
Diferencia entre Serial.print,
Serial.println y Serial.write
Serial.print imprime caracteres ascii.
Serial.println, funciona igual que la anterior excepto que al termino del ultimo carácter le agrega
dos bytes adicionales. Estos son: \r y \n . Retorno de acarreo y salto de linea.
Serial.write, imprime un byte, este byte puede representar tanto un carácter ascii como una
variable numérica.
El siguiente ejemplo, muestra tres conjuntos de instrucciones equivalentes usando las funciones
anteriores.
void setup(){
Serial.begin(9600);
}
void loop(){
//Ejemplo-1
Serial.print("Hola Mundo");
Serial.print("\r\n");
//Ejemplo-2
Serial.println("Hola Mundo");
//Ejemplo-3
Serial.write('H');
Serial.write('o');
Serial.write('l');
Serial.write('a');
Serial.write(' ');
Serial.write('M');
Serial.write('u');
Serial.write('n');
Serial.write('d');
Serial.write('o');
Serial.write('\r');
Serial.write('\n');
while(1); //Esto es una pausa
}
SerialPrint4.ino hosted with ❤ by GitHub view raw
Resumen
La función de Arduino para escribir en el puerto serial es print. Entonces, está función permite
enviar por el puerto tanto caracteres como datos binarios brutos. Dependiendo del ancho de
banda que se quiera usar, uno u otro puede ser bueno. Por ejemplo si modulo serial con el que se
quiera comunicar acepta comandos AT,no hay de otra más que enviar caracteres, si queremos
enviar la información a un celular por bluetooth, lo recomendable es enviar bytes brutos.
Autor: Dr. Rubén E-Marmolejo.
Profesor de la Universidad de Guadalajara
Fuentes:
[1] – https://cdn-learn.adafruit.com/downloads/pdf/adafruit-arduino-lesson-5-the-serial-
monitor.pdf
[2] – https://arduinobot.pbworks.com/f/Manual+Programacion+Arduino.pdf