01 · Del chip al cable
La UART sale de la placa
En los temas 7 a 11 trabajamos con la UART: una trama asíncrona con bit de inicio, datos, paridad y bit de parada, a una velocidad acordada. Todo eso ocurre en el interior de un chip, con niveles lógicos de 0 V y VCC. RS-232 no cambia la trama: la que sale de la UART es exactamente la que viaja por el cable. Lo que define es la capa física que la rodea:
- los niveles de tensión (tensiones positivas y negativas de varios voltios, con la lógica invertida);
- un conector y la función de cada pin (el DE-9, popularmente DB9);
- dos papeles distintos para los extremos del cable, DTE y DCE, que explican por qué existen cables rectos y cables cruzados;
- un conjunto de líneas de control (RTS, CTS, DTR, DSR, DCD, RI) pensadas originalmente para manejar un módem;
- límites de velocidad y distancia.
El estándar, que hoy se conoce como TIA/EIA-232, nació en los años sesenta para conectar terminales con módems. Los PC lo usaron durante tres décadas como puerto «COM». Hoy los ordenadores casi no lo traen, pero se sigue usando en instrumentación y automatización (balanzas, multímetros de laboratorio, analizadores, lectores de código de barras), en equipos de red (la consola de un router o un switch es un RS-232) y en maquinaria industrial. Y su lógica reaparece en todos los adaptadores USB-serie.
Es un enlace punto a punto (un transmisor y un receptor por línea), asimétrico (cada señal usa un solo hilo y se mide respecto de una masa común) y full dúplex (una línea para cada sentido). Esa estructura es la que limitará su alcance y dará paso, en los temas siguientes, a la señal diferencial de RS-422 y RS-485.
02 · Tensión de verdad
Niveles de tensión e inversión
Los niveles RS-232 se alejan de todo lo que vimos en el tema 5. En lugar de una tensión baja y otra alta entre 0 V y VCC, usan tensiones positivas y negativas simétricas, y con la lógica al revés:
| Tensión en la línea | En una línea de datos | En una línea de control |
|---|---|---|
| −3 V a −15 V | 1 lógico: marca (mark), el estado de reposo | OFF |
| +3 V a +15 V | 0 lógico: espacio (space) | ON |
| −3 V a +3 V | Indefinida (zona de transición) | Indefinida |
Cuatro rasgos que conviene fijar:
- La señal sale invertida. Una UART en reposo mantiene su salida en alto (1). En el cable, ese 1 es una tensión negativa. El bit de inicio (0) es una tensión positiva. Un cable RS-232 inactivo, con el puerto abierto, muestra unos −5 a −12 V en el pin de transmisión.
- El transmisor entrega de ±5 V a ±15 V con carga (el estándar pide como mínimo ±5 V con una carga de 3 a 7 kΩ), y los receptores deciden con un umbral de ±3 V. La diferencia es el margen de ruido: al menos 2 V por lado, contra los pocos cientos de milivoltios de las familias TTL y CMOS. Los chips actuales entregan ±5,4 V (3,3 V), ±7,5 V (5 V) o ±12 V según el modelo.
- Los extremos del estándar son duros. Los receptores soportan hasta ±25 V y los transmisores resisten un cortocircuito a masa o a la otra línea: se pueden conectar mal sin quemarse (lo contrario de lo que ocurre al conectar un RS-232 a un pin de microcontrolador).
- Los bordes son lentos a propósito. La velocidad de variación del transmisor está limitada a 30 V/µs para no irradiar ni inducir ruido en cables vecinos.
Un caso particular: mantener la línea de datos en espacio (+V) durante más tiempo que una trama completa es una señal de BREAK, usada para avisar o reiniciar al otro extremo. La UART la detecta como un bit de parada en 0 con todos los datos en 0 (un error de trama, tema 8).
Estos niveles son la razón por la que una línea RS-232 no se conecta jamás directamente a un microcontrolador: −12 V en un pin de 3,3 V (cuyo máximo absoluto ronda −0,3 V) destruye la entrada. Hace falta un transceptor que traduzca los niveles (sección 06).
03 · Nueve pines
El conector y los equipos DTE y DCE
El conector más habitual es el DE-9, que casi todo el mundo llama DB9. Los nueve pines, vistos desde un equipo terminal (el PC):
| Pin | Señal | Sentido (desde el DTE) | Qué es |
|---|---|---|---|
| 1 | DCD | entrada | Detección de portadora de datos |
| 2 | RXD | entrada | Datos recibidos |
| 3 | TXD | salida | Datos transmitidos |
| 4 | DTR | salida | Terminal de datos lista |
| 5 | GND | — | Masa de señal |
| 6 | DSR | entrada | Equipo de datos listo |
| 7 | RTS | salida | Solicitud de envío |
| 8 | CTS | entrada | Libre para enviar |
| 9 | RI | entrada | Indicador de llamada |
La comunicación mínima usa solo tres hilos: TXD, RXD y GND (pines 3, 2 y 5). El resto son las líneas de control de la sección siguiente. El conector original de 25 pines (DB25) reparte las mismas señales en otros pines: TXD en el 2, RXD en el 3, RTS en el 4, CTS en el 5, DSR en el 6, GND en el 7, DCD en el 8, DTR en el 20 y RI en el 22; por eso los adaptadores de 25 a 9 pines no son un cable recto.
El estándar define dos papeles para los extremos del enlace:
DTE (Data Terminal Equipment)
El equipo terminal: el PC, un microcontrolador, un lector. Transmite por el pin 3 y recibe por el 2. Su conector suele ser macho.
DCE (Data Communication Equipment)
El equipo de comunicación: el módem, y muchos instrumentos. Recibe por el pin 3 y transmite por el 2: es el espejo del DTE. Su conector suele ser hembra.
Los nombres de las señales (TXD, RXD, RTS, CTS…) están dados siempre desde el punto de vista del DTE. Por eso, en un módem (DCE), el pin 3 «TXD» es una entrada: ahí llegan los datos que el PC transmite. La idea es que un PC (DTE) y un módem (DCE) se unan con un cable recto, pin a pin: cada salida de uno cae sobre la entrada del otro sin cruzar nada. El problema aparece cuando se unen dos equipos del mismo tipo.
04 · El apretón de manos
Las líneas de control
Además de los datos, RS-232 define seis señales de control. Pensadas para un enlace PC–módem telefónico, cada una cumplía una función en el procedimiento de una llamada:
| Señal | De → a | Significado original | Uso actual |
|---|---|---|---|
| DTR | DTE → DCE | «Terminal lista»: el PC avisa que está encendido y puede atender; sostenida, mantiene la llamada | Indicar que el programa abrió el puerto; reiniciar placas (Arduino y ESP32 usan DTR y RTS a través de un condensador para entrar en el cargador de programas) |
| DSR | DCE → DTE | «Equipo listo»: el módem está encendido y operativo | Detectar que el otro equipo está presente |
| RTS | DTE → DCE | «Solicito enviar»: el PC pide permiso para transmitir | Control de flujo por hardware (el receptor indica que puede recibir); habilitar el transmisor en adaptadores RS-485 |
| CTS | DCE → DTE | «Libre para enviar»: el módem acepta datos | Control de flujo por hardware (el emisor espera CTS activa) |
| DCD | DCE → DTE | «Portadora detectada»: se estableció la conexión con el módem remoto | Indicar conexión establecida; a menudo sin uso |
| RI | DCE → DTE | «Timbre»: suena una llamada entrante | Casi sin uso |
Una secuencia típica con un módem era: el PC activa DTR; el módem responde con DSR; al marcar y conectarse activa DCD; para enviar, el PC activa RTS y espera CTS; y al terminar baja DTR para colgar. Esa coreografía, hoy, casi nadie la necesita, pero cuatro de estas líneas siguen vivas:
- RTS/CTS como control de flujo por hardware, tal como lo vimos en el tema 10: el receptor baja su salida cuando el buffer se acerca a llenarse y el emisor, que mira su entrada, deja de enviar. Es el control de flujo más fiable y el único que sirve con datos binarios.
- DTR y RTS como líneas de salida de propósito general en los adaptadores USB-serie: los programas de carga las usan para reiniciar la placa y para elegir el modo de arranque sin que el usuario toque un botón.
- RTS para dirigir un transceptor RS-485 (tema 24): el programa levanta RTS para transmitir y la baja para recibir.
- Entradas para detectar la presencia del otro equipo (DSR, DCD).
Una consecuencia práctica: si un programa o un equipo tiene activado el control de flujo por hardware y las líneas RTS/CTS no están conectadas como corresponde, los datos no salen: el emisor espera una señal CTS que nunca llega. Es una de las fallas más desconcertantes, y se ve en la sección siguiente.
05 · Qué hilos van adónde
Cables: recto, null modem y lazo
Todo se reduce a una regla: las salidas de un extremo deben caer en las entradas del otro. Con un DTE y un DCE (PC y módem) eso lo cumple el cable recto. Con dos equipos iguales hay que cruzar las líneas a mano:
| Cable | Conexiones | Se usa entre | Con control de flujo por hardware |
|---|---|---|---|
| Recto | 1–1, 2–2, 3–3 … 9–9 | DTE y DCE (PC con módem, con muchos instrumentos) | Sí |
| Null modem de 3 hilos | 2–3, 3–2, 5–5 | Dos DTE (PC con PC, PC con placa de desarrollo) | No: las líneas de control no están conectadas |
| Null modem con puentes locales | 2–3, 3–2, 5–5; en cada conector: 7 con 8 y 1, 4 y 6 unidos | Dos DTE; cada equipo se ve a sí mismo «listo» | No (CTS siempre activa, sin control real) |
| Null modem completo | 2–3, 3–2, 4–6, 6–4, 7–8, 8–7, 5–5 | Dos DTE | Sí |
| Conector de lazo | 2–3 (más 7–8 y 4–6) | Pruebas: lo que se transmite se recibe | — |
Reglas para elegir y probar un cable:
- Saber quién es quién. Un PC y un adaptador USB-serie comunes son DTE; un módem es DCE. Los instrumentos pueden ser de cualquiera de los dos tipos, y se averigua en el manual: si el manual dice «conectar con cable recto» al PC, es DCE; si pide un cable «null modem», es DTE.
- Si no hay comunicación, probar el otro cable. Es el error más común. Con la mano: medir continuidad entre el pin 3 de un extremo y el pin 3 del otro; si hay continuidad, el cable es recto; si hay entre el 3 y el 2, es cruzado.
- El null modem de 3 hilos es el más usado, siempre que ningún extremo use control de flujo por hardware (o se use control por software, XON/XOFF). Con control por hardware, hay que cruzar RTS y CTS (cable completo) o desactivarlo.
- La masa siempre va. Sin el pin 5, las tensiones de la línea no tienen referencia y la comunicación es errática.
- Conectar y desconectar con los equipos apagados evita sorpresas por diferencias de potencial entre masas.
Un cable cruzado entre un DTE y un DCE enfrenta dos salidas (los dos transmisores sobre la misma línea) y deja sin señal a los receptores: no se daña nada (los transmisores toleran el cortocircuito) pero no hay comunicación, y esa ausencia total es el síntoma que se ve.
06 · De 3,3 V a ±5 V
El MAX232 y las tensiones negativas
¿Cómo se obtienen +10 V y −10 V en una placa que solo tiene 5 V, o ni siquiera, 3,3 V? Antes se agregaban fuentes de ±12 V. Hoy se usa un transceptor como el MAX232 (Maxim, 1980), que lleva dentro una bomba de carga (charge pump) alimentada por un solo voltaje:
- Un primer condensador (C1) se carga a VCC y se reconecta apilado sobre VCC: la suma da aproximadamente 2 · VCC, que se guarda en otro condensador (V+).
- Un segundo condensador (C2) toma ese voltaje positivo y lo invierte: se obtiene aproximadamente −2 · VCC (V−).
- Los drivers llevan la salida a V+ o a V−, según el bit de entrada (invirtiéndolo): esos son los niveles del cable. Los receptores convierten las tensiones del cable de vuelta a 0 V / VCC, con umbrales cercanos a ±1,5 V (algunos con histéresis) y una resistencia de entrada de unos 5 kΩ.
El chip trae dos drivers y dos receptores (suficiente para TXD/RXD y RTS/CTS) y necesita cuatro condensadores externos. Las versiones de la familia se eligen por la tensión de alimentación:
| Chip | Alimentación | Salida en el cable (típica) | Velocidad máxima | Condensadores |
|---|---|---|---|---|
| MAX232 | 5 V | ±7,5 V | 120 kbit/s | 4 × 1 µF |
| MAX3232 (y equivalentes: SP3232, ST3232, ADM3202) | 3,0 a 5,5 V | ±5,4 V | 250 kbit/s | 4 × 0,1 µF |
| Versiones «E» (MAX232E, MAX3232E) | igual que arriba | igual | igual | igual, con protección ESD de ±15 kV en los pines del cable |
En el transceptor, el sentido de las conexiones es: TX del microcontrolador → entrada del driver (T1IN) → pin 3 del DB9; pin 2 del DB9 → receptor (R1IN) → salida (R1OUT) → RX del microcontrolador. Los módulos DB9 más difundidos están cableados como un DTE (igual que un PC), de modo que para conectarlos a un PC hace falta un cable null modem, y para conectarlos a un módem o a un instrumento DCE, un cable recto.
Para casos exigentes existen versiones con aislamiento galvánico (por ejemplo el ADM3251E), que separan eléctricamente los dos lados y eliminan los lazos de masa y las diferencias de potencial. Y hay soluciones «económicas» sin chip dedicado (un transistor invirtiendo la señal y tomando la tensión negativa de una línea del propio PC) que funcionan en el banco de pruebas y no son confiables.
07 · Hasta dónde llega
Distancia, velocidad y ruido
El estándar fija dos límites juntos: una velocidad máxima de 20 kbit/s y una capacidad máxima de carga de 2500 pF en el cable. Con un cable de 50 a 100 pF por metro, eso son de 25 a 50 m, y la regla de dedo tradicional es de unos 15 m a 19 200 baudios. La explicación es la misma que en el tema 16: el cable es un condensador que el driver tiene que cargar y descargar, y los bordes se van redondeando; si dejan de ser rápidos frente a la duración del bit, el receptor muestrea mal.
En la práctica los transceptores modernos van más allá del estándar: 115 200 baudios andan sin problemas en cables de varios metros, y los 250 kbit/s del MAX3232 en distancias cortas. A velocidades bajas se puede llegar bastante más lejos, siempre con un cable de baja capacidad. El laboratorio permite estimar cada caso con un modelo simple.
Los problemas reales de RS-232 no son tanto la velocidad como el ruido y las masas:
- La señal está referida a masa. Cada línea se mide respecto del pin 5, y la masa de los dos equipos es la misma sólo si el cable la une. Si entre ellas hay una diferencia de potencial (equipos en tableros eléctricos distintos, motores, tierras mal hechas), esa diferencia se suma o se resta a la señal. Con ±5,4 V de driver y un umbral de ±3 V, una diferencia de más de 2,4 V basta para perder un nivel. Con ±12 V el margen es de 9 V.
- Es punto a punto. Un transmisor por línea. No se pueden conectar varios equipos en paralelo: los drivers se pelearían.
- No es inmune al ruido de modo común: un pulso de ruido que se inyecte en el cable se suma a la señal sin que el receptor tenga forma de restarlo (la señal diferencial del tema 23 resuelve eso).
- Descargas y sobretensiones: los pines expuestos de un conector DB9 reciben electricidad estática y, en instalaciones largas, picos. Las versiones «E» de los transceptores y los supresores de transitorios los protegen.
Por estas razones, para distancias de cientos de metros, entornos industriales ruidosos o varios equipos en el mismo cable, se pasa a las señales diferenciales de los temas siguientes (RS-422 y RS-485).
08 · El puente con el escritorio
Adaptadores USB-serie
Casi ningún ordenador moderno trae puerto COM. Se usan adaptadores USB-serie: un chip convierte entre el protocolo USB y una UART. Los más comunes son los de FTDI (FT232R, FT232H), Silicon Labs (CP2102, CP2104), WCH (CH340, CH341) y Prolific (PL2303). El sistema operativo los ve como un puerto COM virtual (COM3 en Windows, /dev/ttyUSB0 o /dev/ttyACM0 en Linux, /dev/cu.usbserial-… en macOS), y los programas los usan como si fueran un puerto serie clásico. Es el «Serial» que usa el monitor de un Arduino o un ESP32: la placa trae un chip de estos entre el USB y los pines de la UART.
Lo importante, y lo que más rompe placas, es que el chip USB-serie da una UART, no necesariamente un RS-232. Hay dos familias de adaptadores que se parecen mucho:
Adaptador «TTL» (módulo con pines)
Es el que se usa para programar y depurar placas. Tiene pines GND, TX, RX (y a veces VCC, DTR, RTS) con niveles lógicos de 3,3 V o de 5 V (muchos módulos tienen un puente o un conmutador para elegir; algunos solo uno). No es RS-232: conectarlo a un equipo con DB9 no funciona y puede dañarlo.
Adaptador «RS-232» (conector DB9)
Trae el chip USB-serie más un transceptor tipo MAX3232 y un DE-9 macho (se comporta como un DTE). Entrega niveles de ±5 a ±12 V. Es el que se conecta a un instrumento, una consola o un módem. No debe conectarse a los pines de una placa de desarrollo.
Reglas de conexión de un adaptador TTL con una placa:
- TX con RX y RX con TX (cruzados, como siempre en UART) y GND con GND.
- Igualar el nivel de ambos lados (3,3 V con 3,3 V, 5 V con 5 V). Un adaptador de 5 V en un ESP32 pone 5 V en su pin RX. Si hay que mezclar, se usan los métodos del tema 5 (divisor, desplazador).
- No conectar VCC si la placa ya se alimenta por otro camino (otro USB, una fuente): dos fuentes unidas por el cable se pelean.
- Prueba de lazo: unir TX con RX del adaptador y abrir un terminal; lo que se escribe tiene que aparecer como eco. Es la prueba más rápida de que el adaptador, el controlador y el puerto andan.
Algunos detalles de uso: la velocidad se elige en el programa y la define el controlador (los adaptadores aceptan valores no estándar); cada adaptador distinto puede aparecer con un número de COM nuevo; en Linux hay que pertenecer al grupo dialout (o equivalente) para abrir el puerto; y existen clones de algunos chips (sobre todo FTDI) que con ciertos controladores dan problemas. El administrador de dispositivos o dmesg indican si el sistema reconoció el adaptador.
09 · Con el microcontrolador
Con el microcontrolador
El primer programa es la prueba de lazo de un módulo MAX3232 conectado a un ESP32 (RX2 = pin 16, TX2 = pin 17): se unen los pines 2 y 3 del DB9 con un puente y el programa envía un patrón y verifica que vuelve. Es la comprobación de todo el camino: UART, transceptor, condensadores y cableado. Sirve también como autodiagnóstico en una placa propia.
const int PIN_RX = 16; // RX de la UART 2 (salida del MAX3232)
const int PIN_TX = 17; // TX de la UART 2 (entrada del MAX3232)
bool pruebaDeLazo(const byte *patron, byte n, unsigned long esperaMs) {
while (Serial2.available()) Serial2.read(); // vaciar lo que hubiera
Serial2.write(patron, n);
Serial2.flush(); // espera a que salga el último bit
byte recibido[32];
byte k = 0;
unsigned long t0 = millis();
while (k < n && millis() - t0 < esperaMs) {
if (Serial2.available()) recibido[k++] = Serial2.read();
}
if (k == 0) { Serial.println("Sin eco: revisar el puente 2-3, el MAX3232, los condensadores y la alimentación"); return false; }
if (k < n) { Serial.print("Eco incompleto: "); Serial.print(k); Serial.print(" de "); Serial.println(n); return false; }
for (byte i = 0; i < n; i++) {
if (recibido[i] != patron[i]) {
Serial.print("Byte "); Serial.print(i); Serial.print(" distinto: enviado 0x"); Serial.print(patron[i], HEX);
Serial.print(", recibido 0x"); Serial.println(recibido[i], HEX);
return false; // caracteres cambiados: velocidad o formato distintos
}
}
return true;
}
void setup() {
Serial.begin(115200);
Serial2.begin(9600, SERIAL_8N1, PIN_RX, PIN_TX);
Serial.println("Unir los pines 2 y 3 del DB9 y esperar el resultado");
}
void loop() {
const byte patron[] = { 0x55, 0xAA, 0x00, 0xFF, 'R', 'S', '-', '2', '3', '2' }; // 0x55 y 0xAA alternan todos los bits
Serial.println(pruebaDeLazo(patron, sizeof(patron), 200) ? "Lazo correcto" : "Lazo con fallas");
delay(1000);
}
El patrón empieza con 0x55 y 0xAA (010101… y 101010…) porque obligan a todos los bits a cambiar de valor: sirven para detectar un nivel pegado o una velocidad equivocada. 0x00 y 0xFF prueban los extremos. Un resultado de «sin eco» apunta al hardware (alimentación, condensadores del MAX3232, falta del puente); un eco con caracteres cambiados, a la configuración (velocidad, paridad).
El segundo fragmento activa el control de flujo por hardware de la UART del ESP32, con las líneas RTS y CTS en dos pines más del transceptor (que tiene dos drivers y dos receptores):
const int PIN_RX = 16, PIN_TX = 17;
const int PIN_RTS = 4; // salida: va a la entrada T2IN del MAX3232 (DB9 pin 7)
const int PIN_CTS = 5; // entrada: viene de la salida R2OUT del MAX3232 (DB9 pin 8)
void setup() {
Serial.begin(115200);
Serial2.begin(115200, SERIAL_8N1, PIN_RX, PIN_TX);
Serial2.setPins(PIN_RX, PIN_TX, PIN_CTS, PIN_RTS); // asigna los pines de control (según la versión del núcleo)
Serial2.setHwFlowCtrlMode(UART_HW_FLOWCTRL_CTS_RTS, 64); // RTS se baja cuando el buffer llega a 64 bytes
}
void loop() {
if (Serial2.available()) Serial.write(Serial2.read()); // puente: lo que llega por RS-232 se ve en el monitor
}
Del lado de la PC, un programa en Python con la biblioteca pyserial abre el puerto COM del adaptador, maneja DTR y RTS como salidas y lee CTS, DSR, DCD y RI como entradas. Es útil para probar un cable (¿llega la señal de control del otro extremo?) y para entender las líneas de control:
import serial # pip install pyserial
ser = serial.Serial("COM3", 9600, bytesize=8, parity="N", stopbits=1, timeout=1, rtscts=False)
ser.dtr = True # DTR: terminal lista (pin 4)
ser.rts = False # RTS: se maneja a mano (pin 7)
print("CTS:", ser.cts, "DSR:", ser.dsr, "DCD:", ser.cd, "RI:", ser.ri) # entradas de control
ser.write(b"hola\r\n")
print(ser.readline()) # con un conector de lazo vuelve lo enviado
ser.close()
Este tercer bloque es para la PC, no se ejecuta en el navegador. Cambiar rtscts=True activa el control de flujo por hardware en el puerto: si CTS no se activa, write se queda esperando.
10 · Analogía con programación
La línea RS-232 en Python
Los puntos finos de RS-232 (la inversión de la lógica, los umbrales, el margen de ruido, la lógica de los cables y el límite de capacidad) se modelan en pocas líneas. El programa siguiente arma la trama de un byte, la lleva a tensiones de línea, la decodifica con los umbrales de ±3 V (con y sin diferencia de masa), evalúa si un cable permite la comunicación entre dos equipos DTE o DCE, y estima si una línea larga es viable a una velocidad dada.
Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.
def trama_8n1(byte):
return [0] + [(byte >> i) & 1 for i in range(8)] + [1] # inicio, datos (LSB primero), parada
def a_linea(bits, v=12):
return [-v if b else v for b in bits] # 1 = marca = negativa; 0 = espacio = positiva
def receptor(v):
if v > 3:
return 0
if v < -3:
return 1
return None # zona indefinida
def decodificar(volts):
bits = [receptor(v) for v in volts]
if None in bits or bits[0] != 0 or bits[9] != 1:
return None
return sum(b << i for i, b in enumerate(bits[1:9]))
MAPAS = { # qué pin de un extremo cae en qué pin del otro
"recto": {p: p for p in range(1, 10)},
"null modem de 3 hilos": {2: 3, 3: 2, 5: 5},
"null modem completo": {2: 3, 3: 2, 4: 6, 6: 4, 5: 5, 7: 8, 8: 7},
}
def probar(a, b, cable, flujo):
m = MAPAS[cable]
sal = lambda t: 3 if t == "DTE" else 2 # pin por el que cada tipo transmite
ent = lambda t: 2 if t == "DTE" else 3
def datos(x, y):
p = m.get(sal(x))
if p == ent(y):
return "ok"
return "conflicto" if p == sal(y) else "sin conexión"
def control(x, y): # x espera CTS que genera y
p = m.get(8 if x == "DTE" else 7)
return "ok" if p == (7 if y == "DTE" else 8) else "sin señal"
return datos(a, b), datos(b, a), (f"{control(a, b)}/{control(b, a)}" if flujo else "sin control de flujo")
def linea(baudios, pf_por_m, metros, r_salida=300):
c = pf_por_m * metros # pF
subida = 2.2 * r_salida * c * 1e-12 * 1e6 # µs, 10 % a 90 %
bit = 1e6 / baudios
return c, subida, bit, subida / bit * 100
bits = trama_8n1(0x41)
v = a_linea(bits)
print("0x41 en 8N1:", bits)
print("Tensiones: ", [f"{x:+d}" for x in v], "-> decodificado:", hex(decodificar(v)))
print()
print("MAX3232 (±5,4 V) con una diferencia de masa entre equipos:")
for desfase in (0, 1, 2, 3):
vistas = [x + desfase for x in a_linea(bits, 5.4)]
resultado = decodificar(vistas)
print(f" masa +{desfase} V: margen de la marca {2.4 - desfase:+.1f} V, del espacio {2.4 + desfase:+.1f} V -> {hex(resultado) if resultado is not None else 'ilegible'}")
print()
for a, b, cable, flujo in (("DTE", "DCE", "recto", True), ("DTE", "DTE", "recto", False), ("DTE", "DTE", "null modem de 3 hilos", True),
("DTE", "DTE", "null modem completo", True), ("DTE", "DCE", "null modem completo", False), ("DCE", "DCE", "null modem de 3 hilos", False)):
ab, ba, control = probar(a, b, cable, flujo)
print(f"{a}-{b:3} con {cable:22}: A->B {ab:13} B->A {ba:13} flujo: {control}")
print()
for baudios, metros in ((9600, 15), (115200, 15), (115200, 25), (115200, 100), (250000, 15), (250000, 25)):
c, subida, bit, fraccion = linea(baudios, 100, metros)
juicio = "bordes lentos" if fraccion > 30 else ("fuera de la norma, puede andar" if c > 2500 or baudios > 20000 else "dentro de la norma")
print(f"{baudios:6} baud, {metros:3} m: {c:6.0f} pF, subida {subida:5.2f} µs de {bit:6.2f} µs ({fraccion:3.0f} %) -> {juicio}")
Resultado: el byte 0x41 en 8N1 es [0, 1, 0, 0, 0, 0, 0, 1, 0, 1] (inicio, datos con el bit menos significativo primero y parada); en la línea son las tensiones +12 −12 +12 +12 +12 +12 +12 −12 +12 −12, que el receptor decodifica de vuelta como 0x41. Con un driver de ±5,4 V y una diferencia de masa de 0, 1 y 2 V, el mensaje se lee bien (márgenes de la marca de 2,4, 1,4 y 0,4 V); con 3 V la marca queda en −2,4 V, dentro de la zona indefinida, y el byte es ilegible. Con los cables: un recto entre DTE y DCE funciona en los dos sentidos y con control de flujo; entre dos DTE hay conflicto de salidas en los dos sentidos; un null modem de 3 hilos entre dos DTE pasa los datos pero con control de flujo ninguno de los dos recibe CTS (sin señal); el completo funciona con flujo; un null modem entre DTE y DCE da conflicto; y entre dos DCE el de 3 hilos funciona. Para la línea, con 100 pF/m: 9600 baudios a 15 m son 1500 pF con una subida de 0,99 µs (1 % del bit); 115 200 baudios a 15 m, 11 %; a 25 m, 2500 pF y 19 %, en el límite de capacidad y fuera de la norma por la velocidad; a 100 m, 10 000 pF y 76 %, con los bordes demasiado lentos; 250 000 baudios a 15 m, 25 %, y a 25 m, 41 %, con bordes lentos.
Observá que el modelo de la línea es solo una estimación: los drivers reales tienen control de velocidad de subida y no son una resistencia fija de 300 Ω. Pero reproduce la idea que importa: la capacidad del cable se traduce en bordes lentos, y los bordes lentos se comen una fracción creciente del bit.
11 · Exploración interactiva
Laboratorio: niveles, cables, línea y adaptadores
El laboratorio tiene cuatro herramientas. La primera es el receptor y los niveles: elegís el driver, el estado de la línea y una diferencia de masa, y ves qué entiende el receptor (incluida la conexión equivocada a un pin de microcontrolador). La segunda es un probador de cables: elegís el tipo de cada equipo (DTE o DCE), el cable y si hay control de flujo. La tercera estima cuánto cable aguanta una velocidad. La cuarta resuelve qué adaptador USB-serie sirve con qué.
1. Niveles y receptor
Elegí el driver, la diferencia de masa y el receptor.
2. Probador de cables
Elegí los dos equipos y el cable.
3. Cuánto cable aguanta
Elegí la velocidad, el cable y la longitud.
4. ¿Qué adaptador con qué?
Elegí el adaptador y el destino.
En la herramienta 1, los receptores de microcontrolador se evalúan con sus máximos absolutos típicos (de −0,3 V a 3,6 V para 3,3 V; de −0,5 V a 5,5 V para 5 V). En la 2, un equipo DCE se modela con las funciones de los pines invertidas respecto del DTE. En la 3, el modelo supone un driver equivalente a 300 Ω y considera aceptable que el tiempo de subida no supere el 30 % del bit. La 4 resume las reglas de la sección 08.
Recorrido guiado
- Con los valores iniciales (driver de ±5,4 V, línea en 1, sin diferencia de masa), el driver entrega −5,4 V, llega lo mismo y el receptor entiende un 1 con 2,4 V de margen sobre el umbral de −3 V. Un 1 es una tensión negativa. Pasá a «0 lógico»: +5,4 V.
- Con la línea en 1, mové la diferencia de masa a +2 V: llegan −3,4 V, margen de 0,4 V, todavía correcto. A +3 V llegan −2,4 V: dentro de la zona indefinida, el receptor no sabe qué es. A +6 V la marca llega como +0,6 V, también indefinida.
- Cambiá a un driver de ±12 V: la misma diferencia de 3 V no importa (llegan −9 V, margen de 6 V). Con ±12 V se toleran hasta 9 V de diferencia de masa.
- Con el receptor «pin de 3,3 V directo» y la línea en 1: llegan −5,4 V a un pin cuyo mínimo es −0,3 V: «Daño». Con el 0 lógico, +5,4 V sobre un máximo de 3,6 V: también daño. Con el pin de 5 V directo, −5,4 V también supera el mínimo de −0,5 V.
- En la herramienta 2, con los valores iniciales (DTE – DCE, cable recto, sin flujo), los datos pasan en ambos sentidos: «Funciona». Activá RTS/CTS: también anda.
- Cambiá el equipo B a DTE con el cable recto: conflicto de salidas en los dos sentidos. Pasá al null modem de 3 hilos: los datos pasan; con RTS/CTS activado, «los datos pasan, pero se bloquea esperando CTS». Con el null modem completo, anda con flujo.
- Con A = DTE y B = DCE, probá el null modem: conflicto de salidas. Con los dos DCE y el null modem, anda: el cruce corrige el espejo.
- En la herramienta 3, con los valores iniciales (115 200 baudios, 100 pF/m, 15 m): 1500 pF, subida de 0,99 µs sobre un bit de 8,68 µs (11 %). Está fuera de la norma por velocidad (más de 20 kbit/s) pero funciona. Pasá a 9600 baudios: dentro de la norma.
- A 115 200 baudios subí la longitud a 25 m: 2500 pF, 19 %. A 100 m: 10 000 pF, subida de 6,6 µs, 76 % del bit: bordes demasiado lentos. Con 250 000 baudios ya a 25 m falla (41 %).
- En la herramienta 4, el adaptador «DB9» con los pines de un ESP32: incompatible (niveles de ±V contra un pin de 3,3 V); hace falta un MAX3232. El «TTL de 3,3 V» con el ESP32: compatible. El «TTL de 5 V» con el ESP32: incompatible (5 V sobre un pin de 3,3 V). El «DB9» con un equipo DB9: compatible, con el cable que corresponda (null modem para dos DTE).
Desafío: cuánto margen deja un driver de ±5,4 V
Con un driver de ±5,4 V y un receptor con umbral de ±3 V, ¿cuánta diferencia de masa máxima se tolera, y cuánta con ±9 V? La señal de peor caso es la que se aleja del umbral al desplazarse: una marca de −5,4 V que sube con la masa llega a −3 V cuando la diferencia es de 2,4 V (el margen se agota). Con ±5,4 V se toleran 2,4 V de diferencia de masa; con ±9 V, 6 V; con ±12 V, 9 V. Esta es otra razón por la que los chips con tensiones más altas (MAX232 de ±7,5 V o drivers de ±12 V) son más robustos en instalaciones con masas distintas.
12 · Un procedimiento
Diagnóstico de un enlace RS-232
Cuando un enlace RS-232 no funciona, casi siempre es el cable, el formato o el control de flujo, no el hardware. Un recorrido en orden:
- Igualar velocidad y formato en ambos extremos (tema 8): baudios, bits de datos, paridad y bits de parada. Es la causa de los caracteres raros.
- Medir el pin de transmisión en reposo. Con el puerto abierto, debe mostrar unos −5 a −12 V. Si muestra 0 V, el puerto no está activo, el transceptor no está alimentado o se midió el pin equivocado.
- Comprobar el cable: continuidad, recto o null modem, y la masa (pin 5). En caso de duda, probar el otro tipo.
- Hacer una prueba de lazo en cada extremo (pines 2 y 3 unidos) para saber qué lado anda.
- Desactivar el control de flujo al probar. Si con eso funciona, las líneas RTS/CTS están mal cableadas o falta un puente.
- Mirar la señal con un osciloscopio o un analizador con entrada de ±15 V: niveles, bordes y tiempos de bit.
- Revisar el adaptador: que sea del tipo correcto (TTL o RS-232), del nivel correcto, con el controlador instalado y el puerto COM adecuado.
| Síntoma | Causa probable | Qué hacer |
|---|---|---|
| No pasa nada, ni en un sentido ni en el otro | Cable equivocado (recto en lugar de null modem o al revés), sin masa, equipo apagado | Probar el otro cable; medir continuidad; conectar el pin 5 |
| Caracteres incorrectos o «basura» | Velocidad, paridad o bits de datos distintos; ruido por diferencias de masa | Igualar el formato; revisar masas; bajar la velocidad |
| Funciona en un solo sentido | Un hilo de datos cortado o mal cruzado | Revisar TXD y RXD de forma independiente |
| Se detiene después de unos bytes, o no sale nada | Control de flujo por hardware esperando una CTS que no llega | Desactivar el flujo, o cablear RTS/CTS (cable completo) |
| Pierde caracteres a alta velocidad | Buffer lleno sin control de flujo; el receptor no alcanza | Activar el flujo, bajar la velocidad, agrandar el buffer |
| Anda con el cable corto y falla con el largo | Capacidad del cable, bordes lentos, ruido | Bajar la velocidad; cable de baja capacidad; pasar a RS-422/485 |
| Se quemó la entrada de un microcontrolador | Se conectó un RS-232 (o un TTL de 5 V) directo a un pin | Usar un MAX3232 o un adaptador del nivel correcto |
13 · Comprensión
Confusiones frecuentes
«RS-232 y TTL serie son lo mismo, solo cambia el conector»
La trama es la misma, pero la señal eléctrica es completamente distinta: tensiones de ±3 a ±15 V con lógica invertida, contra 0 y VCC. Conectar una con la otra, sin un transceptor entre ambas, no funciona y puede destruir un lado.
«Un 1 lógico es una tensión positiva»
En RS-232 es al revés: el 1 (marca, el estado de reposo) es una tensión negativa, y el 0 (espacio) una positiva. Un cable inactivo con el driver encendido muestra una tensión negativa.
«Un cable DB9 sirve para todo»
Hay cables rectos y cruzados, y cada uno sirve para un caso. Entre un DTE y un DCE se usa uno recto; entre dos DTE, un null modem. Ninguno de los dos funciona en el caso del otro.
«Con tres hilos (TX, RX, GND) alcanza siempre»
Alcanza para los datos. Si algún extremo exige control de flujo por hardware, o espera DSR, DCD o CTS activas, la comunicación no arranca o se detiene. Hay que cablear esas líneas, puentearlas localmente o desactivar la espera.
«Puedo conectar un MAX232 a un ESP32»
Un MAX232 alimentado a 5 V entrega 5 V en la salida de receptor, que llega al pin RX del ESP32 (que no tolera más de unos 3,6 V). Hay que usar un MAX3232 alimentado a 3,3 V, o un desplazador de nivel.
«Un adaptador USB-serie es RS-232»
Depende: los módulos con pines (TX, RX, GND) dan niveles TTL de 3,3 V o 5 V, no RS-232. Solo los que tienen un conector DB9 (con un transceptor interno) entregan niveles RS-232. Se distinguen por el conector y por la hoja de datos.
«RS-232 llega a cientos de metros»
La norma garantiza unos 15 m a velocidades de hasta 20 kbit/s (2500 pF). A velocidades bajas y con cable de baja capacidad se llega más lejos, pero las diferencias de masa y el ruido de un enlace asimétrico lo limitan. Para distancias grandes se usa RS-422 o RS-485.
«Puedo conectar varios equipos a la misma línea RS-232»
No: es un enlace punto a punto, con un único transmisor por línea. Varios drivers sobre la misma línea se pelean. Para un bus de varios equipos se usa RS-485 (tema 24).
14 · Práctica guiada
Predecí antes de comprobar
1. La trama en la línea
Escribí la secuencia de tensiones (±12 V) con la que se transmite la letra «K» (0x4B) en 8N1.
Ver solución
0x4B = 0100 1011. Los datos van con el bit menos significativo primero: 1, 1, 0, 1, 0, 0, 1, 0. Con el bit de inicio (0) y el de parada (1), la secuencia de bits es 0, 1, 1, 0, 1, 0, 0, 1, 0, 1. Como 1 es −12 V y 0 es +12 V: +12, −12, −12, +12, −12, +12, +12, −12, +12, −12 (y la línea queda en −12 V en reposo).
2. Margen de ruido
Un MAX3232 entrega ±5,4 V y el receptor tiene un umbral de ±3 V. ¿Cuál es el margen de ruido? Si los dos equipos tienen una diferencia de masa de 2,5 V, ¿qué pasa?
Ver solución
El margen es 5,4 − 3 = 2,4 V. Con una diferencia de masa de 2,5 V en el sentido que acerca la señal al umbral, una marca de −5,4 V llega como −2,9 V, dentro de la zona indefinida (entre −3 V y +3 V): el receptor no puede asegurar qué es. Con un driver de ±12 V el margen sería de 9 V.
3. Elegir el cable
Querés conectar un PC (por un adaptador USB-serie con DB9) con (a) un módem, (b) otro PC, (c) un módulo MAX3232 con DB9 cableado como DTE. ¿Qué cable usás en cada caso?
Ver solución
(a) PC (DTE) y módem (DCE): cable recto. (b) PC con PC (dos DTE): null modem. (c) PC y un módulo DTE: también null modem, porque los dos transmiten por el pin 3. En cualquier caso con control de flujo por hardware, el cable completo.
4. Un flujo que nunca llega
Dos PC con un cable null modem de 3 hilos; uno de los programas tiene activado RTS/CTS. Los datos no salen. ¿Por qué y cómo se arregla?
Ver solución
El cable de 3 hilos no conecta RTS ni CTS: la entrada CTS del programa queda sin señal y el puerto espera «vía libre» que nunca llega. Se arregla desactivando el control de flujo, usando un null modem completo (RTS con CTS cruzadas) o puenteando RTS con CTS en cada conector.
5. Un cable largo
A 115 200 baudios, con un cable de 30 m de 100 pF/m, ¿cuál es la capacidad, la subida (con un driver de 300 Ω) y la fracción del bit? ¿Y a 250 000 baudios?
Ver solución
C = 30 · 100 pF = 3000 pF, por encima de los 2500 pF de la norma. La subida (10 % a 90 %) es 2,2 · 300 Ω · 3 nF ≈ 2 µs. A 115 200 baudios el bit dura 8,68 µs: la subida ocupa el 23 %, aceptable (fuera de la norma, pero funciona). A 250 000 baudios el bit dura 4 µs: la subida ocupa el 50 %: los bordes son demasiado lentos.
6. Un instrumento con DB9
Tenés un módulo adaptador USB-serie con pines TTL de 3,3 V y un instrumento con conector DB9 RS-232. ¿Qué conectás entre ambos? ¿Cómo van TX y RX?
Ver solución
Entre ambos va un MAX3232 (alimentado a 3,3 V), con el DB9 hacia el instrumento. TX del adaptador → entrada del driver (T1IN), cuyo pin de salida va al pin 3 del DB9 (si el instrumento es DCE, es la entrada de datos del instrumento); el pin 2 del DB9 entra al receptor (R1IN) y su salida va a RX del adaptador. GND común. Si el instrumento fuera DTE, se usa un cruce (null modem) en el lado DB9.
7. El MAX232 en una placa de 3,3 V
Un compañero conecta un módulo «MAX232» alimentado a 5 V al RX de un ESP32. ¿Qué tensión llega al pin y qué debe cambiar?
Ver solución
La salida del receptor del MAX232 a 5 V es de 0 / 5 V. Esos 5 V llegan al pin RX del ESP32, cuyo máximo absoluto es de unos 3,6 V: puede dañarlo. Hay que cambiar el módulo por un MAX3232 alimentado a 3,3 V, o agregar un divisor resistivo o un desplazador de nivel en la línea que va al ESP32.
15 · Síntesis
Ideas para recordar
- RS-232 lleva la trama de la UART por un cable con otros niveles: 1 lógico (marca) = −3 a −15 V, 0 lógico (espacio) = +3 a +15 V. La señal sale invertida y la línea inactiva está en negativo. La zona entre −3 y +3 V es indefinida.
- El margen de ruido (≥ 2 V con ±5 V de driver) es enorme frente al de TTL, pero sigue dependiendo de la masa común: una diferencia de masa grande lo consume.
- No se conecta nunca un RS-232 a un pin de microcontrolador: hace falta un transceptor (MAX232 a 5 V, MAX3232 a 3,3 V o 5 V) que genera ±V con una bomba de carga y condensadores.
- El DE-9 de un DTE: pin 2 RXD, 3 TXD, 5 GND, y las líneas de control 1 DCD, 4 DTR, 6 DSR, 7 RTS, 8 CTS, 9 RI. Las señales se nombran desde el DTE; un DCE tiene los pines de datos en espejo.
- Entre DTE y DCE se usa un cable recto; entre dos equipos iguales, un null modem (de 3 hilos si no hay control de flujo por hardware; completo si lo hay).
- RTS/CTS se usan hoy como control de flujo por hardware; DTR y RTS, como salidas para reiniciar placas o dirigir RS-485. Un control de flujo esperando una CTS que no llega detiene todo.
- Un enlace RS-232 es punto a punto, asimétrico y de unos 15 m a velocidades de hasta 20 kbit/s según la norma (2500 pF); en la práctica más rápido y más corto. La capacidad del cable redondea los bordes.
- Un adaptador USB-serie con pines es TTL (3,3 o 5 V), no RS-232: solo los de conector DB9 lo son. Se iguala el nivel, se cruzan TX y RX y se unen las masas.
¿Listo para el siguiente tema?
Antes de avanzar, dibujá las tensiones de línea con las que se transmite la letra «A» (0x41) en 8N1; elegí el cable para unir un PC con un instrumento DTE sin control de flujo y con control de flujo por hardware; y explicá por qué un MAX232 de 5 V no se conecta directamente a un ESP32 y qué se usa en su lugar. (Para la primera: +12, −12, +12, +12, +12, +12, +12, −12, +12, −12.) Si podés justificar las tres respuestas, entendés RS-232.
En el próximo tema vemos la señal diferencial y RS-422: cómo se logra rechazar el ruido de modo común usando dos hilos por señal, y cómo eso permite más distancia y más velocidad que RS-232.