La comunicación serie es muy importante porque casi todos los protocolos utilizados actualmente son serie y además muchos dispositivos de comunicación inalámbrica usan la comunicación serie para hablar con Arduino como los módulos bluetooth y los módulos Xbee. También la comunicación serie es la que se usa generalmente para comunicar el Arduino con el Ordenador.
Para manejar el puerto serie en Arduino, disponemos de la librería Serial http://arduino.cc/en/Reference/Serial que hereda los métodos de la librería Stream https://www.arduino.cc/en/Reference/Stream
Todas las placas Arduino tienen al menos un puerto serie disponible en los pines digitales 0 (RX) y 1 (TX) compartido con el USB. El Arduino mega dispone de tres puertos adicionales Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX). Estos pines no están conectados al interfaz USB del Arduino.
El Arduino Due tiene tres puertos adicionales y todos los puestos serie tienen niveles de 3.3V TTL.
Métodos más importantes de la librería Serial:
- begin() – estable la velocidad de la UART en baudios para la transmisión serie, también es posible configurar el número de bits de datos, la paridad y los bits de stop, por defecto es 8 bits de datos, sin paridad y un bit de stop. https://www.arduino.cc/en/Serial/Begin
- read() – lee el primer byte entrante del buffer serie. https://www.arduino.cc/en/Serial/Read
- write() – escribe datos en binario sobre el puerto serie. El dato es enviado como un byte o serie de bytes.
- print() – imprime datos al puerto serie como texto ASCII, también permite imprimir en otros formatos. https://www.arduino.cc/en/Serial/Print
- available() – da el número de bytes (caracteres) disponibles para leer en el puerto serie, son datos que han llegado y se almacenan en el buffer serie que tiene un tamaño de 64 bytes. https://www.arduino.cc/en/Serial/Available
- find() – lee datos del buffer serie hasta encontrar el string buscado. https://www.arduino.cc/en/Serial/Find
- parseInt() – busca el siguiente entero válido en el stream de datos del puerto serie. https://www.arduino.cc/en/Serial/ParseInt
- readBytes() – lee datos del buffer serie y lo guarda en una variable buffer. https://www.arduino.cc/en/Serial/ReadBytes
- setTimeout() – configura el máximo de milisegundos de espera para la lectura del puerto serie. Por defecto es un segundo. https://www.arduino.cc/en/Serial/SetTimeout
- readString() – lee caracteres del buffer serie y los guarda en un string. La función termina cuando se produce un timeout. https://www.arduino.cc/en/Serial/ReadString
Resto de funciones disponible para usar con el puerto serie y ejemplos de uso pueden verse en: https://www.arduino.cc/en/Reference/Seria
Buffer Serial: los puertos serie de los microcontroladores tienen un buffer que se va llenando hasta que nosotros lo vamos leyendo con la función read() que lo vamos vaciando, es una pila FIFO. El tamaño del buffer serie en el Arduino Uno es de 64 bytes, cuando se llena ese buffer el resto de elementos recibidos se pierden.
Toda la información del puerto seríe del microcontrolador del arduino UNO la tenemos en la página 170 de http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
Software Serial
Cada microcontrolador tiene un número de puertos serie hardware (UART), pero se ha desarrollado la librería SoftwareSerial para permitir la comunicación serie sobre otros pines digitales de Arduino, usando software para replicar las funcionalidades de la comunicación serie. Es posible tener varios puertos software serial con velocidades de hasta 115200 bps.
Reference de la librería Software Serial, limitaciones y ejemplos en: http://arduino.cc/en/Reference/SoftwareSerial
Práctica: Puerto Serie
Hacer esta práctica de un chat por el puerto serie entre dos ordenadores usando dos Arduinos: https://aprendiendoarduino.wordpress.com/2016/07/02/chat-serie/
Práctica: Menú interactivo con Arduino.
Para unir todo lo visto en una práctica, hacer un ejemplo de un menú interactivo donde se dan varias opciones y pulsando cada una de ellas se ejecuta una acción concreta. Si el valor pulsado no es ninguna de las opciones avisar y volver a mostrar el menú hasta que se pulse una opción correcta.
Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio46-Estructuras_de_Control
Modificar el programa para que haga la pregunta de forma continua.