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:

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

¿ Qué es mejor, transmitir Byte brutos o caracteres ascii?

Por ejemplo, considere el caso del siguiente programa:

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.

Resultado codigo monitor serial con el Arduino serial print

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.

 

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

[3] – https://www.arduino.cc/en/Serial/Print

9 comentarios en «Arduino Serial Print en 5 minutos»

  1. Hola que tal! Tengo un problema, tengo dos botones que si los presiono me mandan un a A y B, si estan en estado bajo mandan una X y Y, antes se mostraban en mi monitor serial cada medio segundo (500ms) pero ahora no, tengo que estar dandole enter para que me aparezca el valor que le mando y yo lo quiero en autómatico cada medio segundo.
    No sé si me pueda ayudar. Por favor seria de gran ayuda y muchas gracias de antemano.

  2. Hola, en tu ejemplo usas la siguieente sentencia, pero no sé por que… Podrias explicarme que significa >>8

    Serial.write(temperatura>>8);

    Gracias.

    1. Eso es cuando se requiere desplazar 8 bits a la derecha el valor de una variable. Lo que pasa es que la instrucción write solo funciona para 8 bits y la variable temperatura tiene más bits. Por lo tanto se manda primero los primeros 8 bits y posteriormente los 8 más significativos con la instrucción que mencionas.

  3. Alguien me puede ayudar tengo que hacer esto en Arduino lo he conseguido pero creo no lo estoy haciendo bien, creo que existen lineas de código mas sencillas.
    Es para subir y bajar un motor , y la placa tiene este sistema de datos. Mi pregunta es como codificarlo. tengo el numero de motor que es un byte o un int, es decir va desde el 1 al 32 que son el numero de motores. Luego ese numero en hexadecimal ejem nº 10 = 0AH….con esto construyo el N.CANAL H = 0 y N.CANAL L = A y lo que tengo que enviar es su valor en ASCII de estos; seria el 30h y 41h….

    El caso es que me lío con print, write y no se lo que mando…si me manda solo un byte .Gracias

    Formato: 1200bps, 8 bits, No paridad, 1 bit stop
    Consola ——> Filtro
    STX + N.Canal_H+ N.Canal_L+ Codigo+Checksum_H+Checksum_L+ETX
    STX=2
    ETX=3
    El número de canal (entre 1 y 32)se envía en formato ASCII-Hexadecimal
    Ejemplo: N canal 10 (decimal) = 0Ah (Hexadecimal)
    N.Canal_H = 30h (valor ASCII de 0)
    N Canal_L = 41h (Valor ASCII de “A”)
    Codigo: 31h = Subir
    32h = Bajar
    34h=Stop

  4. EN ARDUINO 1 Y L293 TENGO UN MOTOR DC QUE PROGRAMÉ PARA QUE FUNCIONARA CON VELOCIDAD CONSTANTE Y CUANDO LO PARO EN EL PRINT LINE ME QUEDA A LA VELOCIDAD QUE TENIA NO SE PONE EN CERO.
    QUE HAY QUE HACER?

Deja una respuesta

Tu dirección de correo electrónico no será publicada.