RS-232 & UART
El protocolo serial que no muere
Nacido en los años 60, vigente en 2025. Historia completa del estándar serial que conectó al mundo antes de que existiera el USB — y que hoy vive dentro de cada microcontrolador del planeta.
Cuando abrís el panel de un PLC industrial, conectás un GPS a tu Arduino, configurás un router por consola o flasheás un ESP32, estás usando —en alguna capa— el mismo protocolo estandarizado en 1969. El RS-232 y su contraparte lógica, el UART, son probablemente los protocolos de comunicación serial de propósito general más longevos de la historia de la informática. Esta guía recorre su historia completa, explica cómo funcionan a fondo, detalla todas sus variantes y analiza cuánto se usan realmente hoy y en qué dispositivos.
📡
UART vs RS-232 — No son lo mismo
La confusión más común es usar ambos términos como sinónimos. Son cosas distintas que trabajan juntas:
Es un periférico hardware dentro del microcontrolador. Implementa la lógica de comunicación serial asíncrona: serializa bytes, agrega start/stop bits, maneja el baud rate. Opera con niveles lógicos TTL (0V / 3.3V o 5V). Está en prácticamente el 100% de los MCUs modernos.
Es el estándar eléctrico que define tensiones (±12V típico), conector (DB-9 / DB-25), señales de control (RTS, CTS, DTR, DSR) y distancias máximas. Para conectar un UART a RS-232 se necesita un chip conversor de niveles como el MAX232.
Regla práctica: El ESP32 tiene UART. Tu PC tiene RS-232. Para conectarlos se necesita un MAX232 (o un adaptador USB-serial como el CH340 que hace todo en uno). Son capas distintas del mismo concepto.
📜
Historia — De los teletipos a los microcontroladores
La comunicación serial tiene raíces en el telégrafo del siglo XIX, pero la historia moderna del RS-232 comienza en los laboratorios de Bell cuando la necesidad de conectar terminales a módems telefónicos exigía un estándar común.
La Electronic Industries Alliance (EIA) inicia los trabajos para estandarizar la interfaz entre equipos terminales de datos (DTE) y equipos de comunicación (DCE). El objetivo es que cualquier terminal pueda hablar con cualquier módem telefónico sin importar el fabricante.
Se publica la primera versión completa. Define niveles de tensión lógica (±12V típico, ±25V máximo), conector DB-25, velocidades hasta 20 kbps y un conjunto de señales de control (RTS, CTS, DTR, DSR). Era el mundo de las mainframes y los módems de 300 baud.
La revisión C consolida el estándar y se convierte en la más adoptada de toda la historia. Los primeros PC IBM (1981) incluirán puerto COM basado en RS-232-C. Esta es la versión que la mayoría de la gente conoce como “puerto serie”.
El IBM PC y sus clones popularizaron el puerto COM (DB-9) en cada escritorio del planeta. Ratones seriales, módems externos, plóteres, impresoras y terminales se conectaban todos por RS-232. El chip UART 8250/16550 de National Semiconductor se volvió omnipresente. Se estima que en este período se fabricaron más de 500 millones de puertos RS-232.
National Semiconductor introduce el 16550A con buffers FIFO de 16 bytes tanto en TX como en RX. Esto eliminó la pérdida de datos a altas velocidades cuando la CPU no podía atender cada byte individual. El 16550A se convirtió en la referencia de compatibilidad en Linux y Windows hasta el día de hoy.
El estándar pasa a llamarse EIA-232-D. Se clarifica la definición de tiempos de señal, se ajustan tolerancias y se acepta oficialmente el conector DB-9 como alternativa al DB-25 original, dado que las PCs ya lo usaban de facto desde el AT.
La llegada del USB 1.0 (1996) y su adopción masiva con Windows 98 empieza a desplazar el puerto COM de las PCs domésticas. Intel y Microsoft lo excluyen del estándar PC 2001. Los titulares de la época proclamaban la muerte del puerto serie. No murió — simplemente cambió de contexto.
La explosión de los microcontroladores y el movimiento maker devuelven al UART al primer plano. Cada Arduino, PIC, STM32, ESP8266, ESP32, Raspberry Pi y cientos de módulos GPS, GSM, Bluetooth y WiFi se comunican por UART. En 2025, con el IoT industrial y el edge computing, el UART tiene más instancias activas que en cualquier momento de su historia.
⚙️
Cómo funciona el UART en detalle
El UART es un protocolo asíncrono: no existe una línea de reloj separada. El transmisor y el receptor deben acordar de antemano la velocidad (baud rate) y el formato del frame. Cada byte se encapsula en un frame con la siguiente estructura:

Anatomía del frame UART
Siempre nivel 0 (LOW), duración de 1 bit. Avisa al receptor que comienza una transmisión rompiendo el estado IDLE que es nivel alto. El receptor detecta el flanco descendente y sincroniza su reloj interno.
Normalmente 8 bits, transmitidos LSB (bit menos significativo) primero. Puede configurarse en 5, 6, 7 u 8 bits según el protocolo. El receptor muestrea cada bit en el centro de su período para mayor confiabilidad.
Opcional. Puede ser: par (Even), impar (Odd), siempre 0 (Space), siempre 1 (Mark) o ausente (None). Solo detecta errores de 1 bit. La configuración más común es N (ninguno). Si se usa, agrega 1 bit entre los datos y el stop.
Siempre nivel 1 (HIGH). Puede ser 1, 1.5 o 2 bits. Marca el fin del frame y da tiempo al receptor para procesar el byte antes del siguiente START bit. La configuración estándar moderna es 1 stop bit.
Baud rate — velocidades estándar
El baud rate indica la cantidad de símbolos (bits) por segundo. En UART, 1 baud = 1 bit. Las velocidades estándar más comunes son:
| Baud rate | Uso típico | Bytes/segundo útiles (8N1) |
|---|---|---|
| 300 | Módems históricos, teletipos | 30 B/s |
| 9600 | GPS NMEA, equipos industriales, consolas de red | 960 B/s |
| 19200 | Modbus RTU, equipos médicos legacy | 1920 B/s |
| 57600 | Módulos Bluetooth clásico | 5760 B/s |
| 115200 | Arduino IDE, ESP32 debug, módulos GSM/GPS modernos | 11520 B/s |
| 230400 | STM32, algunos módulos WiFi | 23040 B/s |
| 921600 | Flash de ESP32/ESP8266, STM32 alta velocidad | 92160 B/s |
| 1M — 4M | UART hardware moderno (STM32, RP2040), límite PCB | hasta 400 KB/s |
⚠ Tolerancia de baud rate: El error máximo aceptable entre transmisor y receptor es de ±2–3%. Con un cristal de 16 MHz en un AVR y 115200 baud el error es ~0.2%, perfectamente confiable. Con osciladores RC internos puede llegar a 2–3%, que es el límite. Más error → bits corruptos → garbage en el monitor serie.
🔌
Conector DB-9 — Las 9 señales del RS-232
El conector DB-9 (técnicamente DE-9) reemplazó al DB-25 original en la era del IBM PC/AT. Sus nueve pines cubren los datos y las señales de handshaking para control de flujo con módems:
| Pin DB-9 | Señal | Nombre completo | Dir. | Función |
|---|---|---|---|---|
| 1 | DCD | Data Carrier Detect | ← IN | El módem detectó portadora en la línea telefónica |
| 2 | RXD | Received Data | ← IN | Datos recibidos del equipo remoto |
| 3 | TXD | Transmitted Data | → OUT | Datos enviados por el DTE (terminal) |
| 4 | DTR | Data Terminal Ready | → OUT | El terminal está encendido y listo para operar |
| 5 | GND | Signal Ground | — | Tierra de señal — referencia común obligatoria |
| 6 | DSR | Data Set Ready | ← IN | El módem está listo para operar |
| 7 | RTS | Request To Send | → OUT | El terminal solicita permiso para transmitir (flow control) |
| 8 | CTS | Clear To Send | ← IN | El módem da permiso para transmitir (flow control) |
| 9 | RI | Ring Indicator | ← IN | Indica llamada entrante en la línea telefónica |
Para makers: En el 99% de los proyectos embebidos solo se usan TXD (pin 3), RXD (pin 2) y GND (pin 5). Los pines de control (RTS/CTS, DTR/DSR) se pueden conectar en loopback (7↔8 y 4↔6) si el software los requiere pero el hardware no los usa realmente.
⚡
Niveles eléctricos — RS-232 vs TTL vs RS-485
Mezclar niveles eléctricos sin conversión es el error más destructivo que puede cometer un maker. Conectar directamente un microcontrolador (TTL/LVTTL) a un puerto RS-232 físico puede dañar el MCU permanentemente:
| Estándar | Lógico “1” (MARK) | Lógico “0” (SPACE) | Distancia máx. | Nodos |
|---|---|---|---|---|
| RS-232 | −3V a −25V | +3V a +25V | 15 m @ 20 kbps | 1 a 1 |
| TTL 5V | > 2.4V | < 0.8V | corta (PCB) | 1 a 1 |
| LVTTL 3.3V | > 2.0V | < 0.8V | corta (PCB) | 1 a 1 |
| RS-422 | Diferencial A−B > +2V | Diferencial A−B < −2V | 1200 m @ 100 kbps | 1 TX / 10 RX |
| RS-485 | Diferencial A−B > +0.2V | Diferencial A−B < −0.2V | 1200 m @ 100 kbps | 32 nodos (bus) |
Para convertir entre TTL y RS-232 se usan chips MAX232 (o SP3232 para 3.3V), que generan ±12V internamente con una bomba de carga. Para conversión a USB, los más usados son el CH340G (económico, muy común en clones Arduino), el CP2102 (Silicon Labs) y el FT232RL (FTDI, el más robusto).
🔀
Evolución y variantes — 60 años de mejoras
Señalización diferencial sobre par trenzado, half-duplex, multi-punto con hasta 32 nodos en un bus compartido (más con repetidores). Inmune al ruido electromagnético en entornos industriales. Soporta distancias de hasta 1200 metros a 100 kbps, o 10 metros a 10 Mbps. Es la capa física de Modbus RTU, DMX512 y PROFIBUS — los protocolos de automatización más usados del mundo.
Versión diferencial del RS-232 pero solo en un sentido (full-duplex con 2 pares). Hasta 10 Mbps en distancias cortas, o 100 kbps a 1200 m. Muy usado en equipos de audio/video profesional, maquinaria CNC y sistemas de medición de precisión donde el ruido eléctrico es una preocupación.
Evolución de UART para el mercado automotriz. Un solo hilo de datos más masa (sin par diferencial), topología maestro/esclavo, velocidad máxima de 20 kbps. Está presente en decenas de nodos por vehículo moderno: espejos eléctricos, ventanas, asientos, sensores de temperatura de cabina, LEDs interiores y más. Económico de implementar al no necesitar tranceivers diferenciales.
El USART (Universal Synchronous/Asynchronous Receiver/Transmitter) agrega un pin de reloj externo para operar en modo síncrono. Disponible en AVR (ATmega), STM32, PIC y otros. En modo síncrono puede operar como maestro SPI sobre los mismos pines TX/RX, lo que da mucha flexibilidad de diseño al programador de firmware.
La clase USB CDC-ACM (Communications Device Class – Abstract Control Model) permite que un dispositivo USB se presente al sistema operativo como un puerto COM virtual. Es lo que hacen el CH340, CP2102, FT232 y los STM32 Nucleo con su ST-Link. El Arduino IDE ve un “COMx” o “/dev/ttyUSBx” como si fuera un puerto serie real. El protocolo subyacente sigue siendo UART, simplemente encapsulado en USB.
Hardware (RTS/CTS): El receptor baja RTS cuando su buffer está casi lleno. El transmisor detiene el envío hasta que CTS vuelva a estar activo. Totalmente transparente a la aplicación. Software (XON/XOFF): El receptor envía el byte 0x13 (XOFF) para pausar la transmisión y 0x11 (XON) para reanudarla. No requiere pines adicionales pero consume ancho de banda.
💻
Código práctico — Tres plataformas
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Configuración 115200 baud, 8 data bits, sin paridad, 1 stop bit void setup() { Serial.begin(115200); // Para 9600 baud, 7 bits, paridad par, 1 stop bit: // Serial.begin(9600, SERIAL_7E1); } void loop() { if (Serial.available()) { char c = Serial.read(); Serial.print("Recibí: 0x"); Serial.println(c, HEX); } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
// El ESP32 tiene 3 UARTs hardware: // UART0 (USB/debug), UART1 y UART2 // Los pines son completamente reasignables #include <HardwareSerial.h> // Crear instancia para UART2 HardwareSerial GPS_Serial(2); void setup() { // UART0 → Debug por USB Serial.begin(115200); // UART2 // Baudrate: 9600 // Formato: 8 data bits, No parity, 1 stop bit // RX = GPIO16 // TX = GPIO17 GPS_Serial.begin(9600, SERIAL_8N1, 16, 17); Serial.println("Inicializando GPS..."); } void loop() { // Verificar si llegan datos desde el GPS if (GPS_Serial.available()) { // Leer una línea completa String trama = GPS_Serial.readStringUntil('\n'); // Mostrar solo tramas GPRMC if (trama.startsWith("$GPRMC")) { Serial.println("GPS: " + trama); } } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// Configurado con STM32CubeMX: // UART2 → 115200 baud, 8 data bits, No parity, 1 stop bit // Recepción mediante DMA circular UART_HandleTypeDef huart2; uint8_t rxBuf[64]; void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; HAL_UART_Init(&huart2); // Iniciar DMA circular // La CPU queda libre mientras llegan datos HAL_UART_Receive_DMA(&huart2, rxBuf, sizeof(rxBuf)); } // Callback automático al completar el buffer DMA void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART2) { // Procesar datos recibidos procesarDatos(rxBuf, sizeof(rxBuf)); // Reiniciar recepción DMA HAL_UART_Receive_DMA(&huart2, rxBuf, sizeof(rxBuf)); } } |
📊
¿Cuánto se usa hoy? — El estado en 2025
La respuesta corta es: enormemente. Es uno de los protocolos más utilizados del planeta si se suman todas sus formas. La confusión viene de que en muchos casos está “escondido” dentro de otro protocolo o producto.
Microcontroladores
~98%
Módulos GPS / GNSS
~95%
Equipos industriales
~90%
Automotriz (LIN bus)
~85%
Routers / Networking
~80%
PCs desktop/laptop
~20%
Puerto RS-232 físico
~12%
* % de dispositivos de cada categoría que incluyen UART en alguna forma. Estimaciones basadas en cobertura de datasheets y reportes de mercado de semiconductores 2024.
Dónde lo encontramos hoy
Prácticamente el 100% de los MCUs modernos incluye al menos un UART. Arduino (ATmega), ESP32, STM32, PIC, RP2040, nRF52840, RISC-V GD32… todos tienen UART hardware. Es la interfaz de debug universal.
El protocolo NMEA-0183 de los módulos GPS (NEO-6M, NEO-8M, u-blox M10, L80) se transmite por UART a 9600 baud por defecto. Es el estándar desde los años 80. Cada tracker vehicular, drone y barco lo usa.
SIM800, SIM7600, EC21, A7670 y prácticamente todos los módulos celulares se controlan por UART con comandos AT (Hayes Command Set, también de los 80s). ESP32 + SIM800L es un diseño de producción actual.
PM2.5/PM10 (PMS5003, SDS011), CO2 (MH-Z19, SCD41), distancia ultrasónica, balanzas industriales, lectores de código de barras, pantallas Nextion. UART es la interfaz estándar para sensores con salida digital.
Modbus RTU corre sobre RS-485 (capa física) con tramas de formato UART (capa lógica). Es el protocolo de automatización más usado del mundo, con cientos de millones de dispositivos activos en fábricas y edificios.
Todos los routers, switches y firewalls profesionales (Cisco, MikroTik, Juniper) tienen un puerto de consola RS-232 o USB-serial. El estándar sigue siendo 9600 8N1 con cable rollover para configuración de emergencia.
El bus LIN (UART simplificado de un solo hilo) controla subsistemas de bajo costo en cada auto moderno: asientos, espejos, ventanas, sensores de lluvia, climatización. Hasta 80 nodos LIN por vehículo de alta gama.
Balanzas analíticas, glucómetros de laboratorio, impresoras de tickets fiscales (AFIP), controladores POS, lectores biométricos, sistemas de control de acceso. RS-232 y RS-485 dominan por su robustez y certificación.
⚖️
Ventajas y limitaciones
✓ Debug nativo — Serial.print() es la ventana directa al firmware. El primer periférico en cualquier bring-up
✓ Determinismo — Un byte tarda exactamente 10 tiempos de bit (8N1). Útil en tiempo real
✓ Ecosistema inmenso — 60 años de documentación, librerías y soporte en todo compilador y RTOS
✓ Bajo consumo — Sin terminaciones de bus ni lógica de arbitraje adicional
✗ Detección de error básica — El bit de paridad solo detecta errores de 1 bit. Para más confiabilidad agregar CRC (Modbus, HDLC)
✗ Sincronización crítica — Ambos extremos deben usar exactamente el mismo baud rate. Error >3% → datos corruptos
✗ Sin direccionamiento — Los protocolos de capa superior (Modbus, AT commands) deben agregarlo
✗ Velocidad moderada — Para >4 Mbps usar SPI o USB
Conclusión: El RS-232/UART es el ejemplo más claro de un protocolo que “nunca muere” porque encontró su nicho natural: la comunicación simple, confiable y ubicua entre un microcontrolador y el mundo exterior. En 2025 tiene más instancias activas que en cualquier otro momento de su historia gracias al IoT y la automatización industrial. Mientras existan microcontroladores, existirá el UART.
Fuentes: EIA/TIA-232 Standard · Datasheets MAX232, FT232RL, CH340G · u-blox NEO-M8 Integration Manual · Modbus.org Protocol Specification · NMEA 0183 Standard · STM32 HAL Documentation · Espressif ESP32 Technical Reference Manual
Artículo publicado en rogerbit.com — Argentina, 2025.