En este tutorial, profundizamos en el UART corto de receptor-transmisor asíncrono universal.
Aprende las siguientes partes:
- Configuración de protocolo
- Transmisión de datos y encuadre
- Ventajas y desventajas
Al final de este tutorial, encontrará un ejemplo paso a paso de la comunicación UART entre un Arduino Uno y un ESP8266 NodeMCU
Comparación de protocolos de comunicación de microcontroladores desde una perspectiva UART
UART es el único protocolo de comunicación en serie asíncrono y se utiliza en módulos lectores de tarjetas RFID como interfaz de comunicación independiente. Pero UART generalmente se encuentra más dentro de microcontroladores.
En comparación con I2C y SPI, UART es el protocolo de comunicación más antiguo, inventado en 1960 por Gordon Bell en Digital Equipment Corporation.
La siguiente tabla compara los protocolos de comunicación I2C, SPI y UART según diferentes categorías.
. . . . . . . . . .
Descripción | I2C | SPI | UART | |
---|---|---|---|---|
Inventado por | 1982 por Philips Semiconductor | 1970 por Motorola | 1960 por Gordon Bell en Digital Equipment Corporation | |
Transferencia de datos síncrona | Se necesita una línea de reloj para sincronizar la comunicación | Verdadero | Verdadero | Falso |
Transferencia de datos asíncrona | En lugar de una señal de reloj, el propio vapor de datos contiene señales de inicio y de parada | False | False | True |
Rendimiento | De 10.000 a 1.000.000 de bits/s | Hasta 10.000.000 de bits/s | Hasta 115.200 bits/s | |
El esclavo necesita una dirección única | Verdadero | Falso | Falso | |
Número de pines necesarios | 2 | 4 | 2 | |
Protocolo de comprobación de errores | Verdadero | Falso | Verdadero | |
Multi-maestro | Puede tener varios maestros que controlen uno o varios esclavos | Verdadero | Falso | Falso |
Multi-esclavo | Puede conectar varias salves a un solo maestro | Verdadero | Verdadero | Falso |
Conmutación de paquetes | Los datos transferidos se agrupan en paquetes/mensajes, compuestos por una cabecera y una carga útil | Verdadero | Falso | Falso |
Single-ended | Los datos se transfieren por un solo cable | True Datos en serie (SDA) | Falso Master in Slave Out (MISO) Master Out Slave In (MOSI) | False |
Conexión serie | Los datos se transfieren bit a bit a lo largo de un solo cable | Verdadero | Verdadero | Verdadero |
La principal desventaja de UART es que no se admite la comunicación multimaestro y multiesclavo. Por lo tanto, siempre hay 1 dispositivo maestro y 1 dispositivo esclavo.
Dado que la transferencia de datos es asincrónica, UART no necesita una señal de reloj para sincronizar la transferencia de datos, y los datos se pueden enviar y recibir en diferentes momentos. Si los dispositivos maestro y esclavo envían y reciben datos al mismo tiempo, lo que se denomina comunicación dúplex completo, cada dispositivo necesita 2 registros de desplazamiento para almacenar los caracteres de transmisión y recepción. Esto es necesario porque un dispositivo puede recibir un nuevo byte de datos mientras envía un byte de datos.
En comparación, en la comunicación SPI, el maestro y el esclavo solo necesitan un registro de desplazamiento para recibir señales porque, debido a la transferencia de datos sincrónica, el registro de desplazamiento se vacía y se llena al mismo tiempo y debido a que el tamaño del registro de desplazamiento es el mismo para todos los dispositivos, el la transferencia de datos comienza y termina al mismo tiempo.
Además de la comunicación full duplex, existen otras dos formas de comunicación que solo requieren un registro de turno único:
- simplex: una dirección sin provisión para el dispositivo receptor (disparar y olvidar)
- semidúplex: los dispositivos transmiten y reciben a su vez
Configuración del protocolo de comunicación UART
En la mayoría de las aplicaciones, el bit menos significativo se transmite primero. Para evitar la pérdida de datos a altas velocidades de transmisión, muchos dispositivos UART tienen un pequeño búfer FIFO (primero en entrar, primero en salir) entre el registro de desplazamiento y el sistema host.
La frecuencia del reloj suele ser de 8 a 16 veces la tasa de bits. El receptor prueba el estado de la señal entrante con la frecuencia del reloj. Si el bit de inicio excede al menos la mitad del tiempo del bit, el receptor detecta el bit de inicio válido. De lo contrario, se ignora el bit de inicio. La velocidad del reloj, también conocida como velocidad en baudios, generalmente se establece en 9600 bits por segundo.
Transmisión de datos y encuadre UART
Una ventaja de UART es que solo se necesitan 2 cables para la comunicación entre el dispositivo maestro y esclavo, ya que no hay necesidad de una línea de reloj y, al igual que la comunicación SPI, ya no hay una línea de selección esclava. Las 2 líneas son:
- TX (transmisión)
- RX (recepción)
En la imagen de arriba, ves que las líneas están cruzadas para que TX y RX estén conectados entre los dispositivos.
Primero, el dispositivo que transmite los datos recibe la trama de datos en paralelo desde el bus de datos. El dispositivo UART agrega el bit de inicio, el bit de paridad y los bits de parada a la trama de datos antes de que el paquete de datos completo se envíe a través de UART al dispositivo receptor. El dispositivo UART receptor extrae la trama de datos y la transmite en paralelo a través del bus de datos.
La siguiente imagen y descripción brindan una explicación más detallada de los procesos de encuadre durante la comunicación UART.
Si no hay comunicación UART activa, el estado inactivo en las líneas de comunicación es lógico ALTO porque en el momento de la telegrafía, una línea preparada alta indica que el transmisor no está dañado.
El bit de inicio es el primer bit que se transfiere como lógica BAJA, indica que se transfiere un nuevo carácter.
Después, el bit de inicio sigue la trama de datos real, cuyo formato y tamaño de los datos se pueden configurar entre 5 y 9 bits.
Después de que la trama de datos sigue un bit de paridad opcional que le da a UART la capacidad de verificar errores. El bit de paridad es 0 si la suma de 1 bits en la trama de datos es par y 1 si la suma de 1 bits en la trama de datos es impar. Este método de verificación de errores evita que los bits cambien durante la transferencia.
Los últimos bits se reservan como bits de parada e indican que el carácter está completo. Por lo tanto, los bits de parada tiran de la línea ALTA
Si la comunicación se termina y debe terminarse, el maestro ha puesto la línea en lógica BAJA por más de un tiempo de carácter. Esto le indica al esclavo que la comunicación UART está completa.
Ventajas y desventajas de UART
Ventajas
- UART solo usa 2 cables para la comunicación
- No se necesita una línea de señal de reloj adicional
- La comprobación de errores es posible gracias al bit de paridad
Desventajas
- El tamaño de la trama de datos está limitado a 9 bits.
- No hay soporte para la comunicación con múltiples maestros o esclavos.
Comunicación UART entre Arduino y ESP8266
La siguiente tabla le ofrece una descripción general de todos los componentes y partes que utilicé para este tutorial.
Arduino Uno | Amazon | AliExpress |
ESP8266 NodeMCU | Amazon | AliExpress |
Pantalla LCD de 20×4 | Amazon | AliExpress |
Pantalla LCD 16×2 | Amazon | AliExpress |
En el siguiente ejemplo, queremos enviar una cadena desde un Arduino Uno a un ESP8266 NodeMCU a través de la línea de comunicación UART y mostrar la cadena en una pantalla LCD.
La siguiente imagen muestra la conexión entre el microcontrolador Arduino y ESP8266 y la pantalla LCD. Si no sabe qué son los pines TX (transmisión) y RX (recepción), encontrará una descripción general muy útil en los artículos de asignación de pines del microcontrolador: Arduino Nano, Arduino Uno, Arduino Mega, ESP8266. O mejor si descarga el libro electrónico de la hoja de datos del microcontrolador.
Haga clic en la imagen para ampliarla y ver mejor qué pines se utilizan.
En la siguiente parte, vamos paso a paso por el código del programa.
La primera parte es el script Arduino Uno que envía una cadena a través de UART.
void setup() { Serial.begin(9600); } void loop() { Serial.print("CATr"); delay(1000); }
El guión es muy breve y sencillo. No se incluyen bibliotecas. En la función de configuración, necesitamos establecer la velocidad en baudios en 9600. Un segundo argumento opcional configura los datos, la paridad y los bits de parada. El valor predeterminado es 8 bits de datos, sin paridad y un bit de parada que estamos usando en este ejemplo.
En la función de bucle, enviamos la cadena a través de la función en serie cada segundo. La parte » r» le dirá al receptor que la cadena está completa.
Ahora nos ocupamos del script del receptor para el ESP8266 NodeMCU.
#include "LiquidCrystal_I2C.h" #include "Wire.h" LiquidCrystal_I2C lcd(0x27, 20, 4); char buff [50]; volatile byte indx; void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); lcd.clear(); } void loop() { if (Serial.available() > 0) { byte c = Serial.read(); if (indx < sizeof buff) { buff [indx++] = c; // save data in the next index in the array buff if (c == 'r') { //check for the end of the word lcd.print(buff); delay(1000); indx= 0; //reset button to zero lcd.clear(); } } } }
Primero necesitamos incluir la biblioteca LiquidCrystal_I2C para facilitar la comunicación con la pantalla LCD. Se debe incluir el segundo cable de la biblioteca para permitir la comunicación I2C entre el NodeMCU y la pantalla LCD.
Inicializamos la pantalla LCD de 20 × 4 a la dirección HEX 0x27. Para identificar la dirección hexadecimal de su dispositivo I2C, encontrará un escáner de direcciones hexadecimales en este artículo.
Las variables buff almacenan los valores entrantes a través de UART y la variable indx almacena el índice de 8 bits.
En la función de configuración, la velocidad en baudios también se establece en 9600, que debería coincidir con la velocidad en baudios del Arduino Uno. La pantalla LCD también se inicializa, limpia y la luz de fondo está encendida.
En la función de bucle, verificamos si la conexión en serie está disponible y luego leemos los datos en serie entrantes byte por byte mientras escribimos cada byte en el búfer de matriz de bytes. Si detectamos el final de la cadena, definido por » r», imprimimos el contenido de la tabla en la pantalla LCD. Después de 1 segundo, restablecemos el índice de la matriz y limpiamos la pantalla para los siguientes datos entrantes.
Conclusión
En este tutorial, primero comparamos el protocolo de comunicación UART con I2C y SPI. También discutimos la configuración de UART y cómo se transmiten los datos entre 2 dispositivos. Al final de este artículo, vimos un ejemplo para transferir una cadena de un Arduino Uno a un NodeMCU a través de UART.
Si tiene alguna pregunta sobre la comunicación UART, utilice la sección de comentarios a continuación para hacer sus preguntas. Les responderé lo antes posible.