Comunicaciones Serie en Windows (I): bestiario.

La apertura y configuración correcta del puerto serie es el primer paso de cualquier comunicación seria

Por Mario Rodríguez

El auge de Internet parece minimizar la demanda de aplicaciones que utilicen la comunicación directa a través de los puertos del ordenador. El desarrollo de técnicas avanzadas de comunicación (vía satélite, infrarrojos, …) parecen relegar a las comunicaciones serie a una mera curiosidad para nostálgicos. Quizá el día que los niños nazcan con un teléfono móvil bajo el brazo nos comuniquen lo malo que es el continuo bombardeo de ondas de todo tipo y debamos volver a las comunicaciones ‘de toda la vida’.

Sea como fuere, pasará mucho tiempo antes de que las nuevas formas de comunicación reemplacen a las comunicaciones serie en aplicaciones de ‘tiempo real o críticas, donde la rapidez de respuesta sea prioritaria: pensar que esa máquina que está a punto de aplastar a un obrero no puede pararse desde este ordenador porque el servidor de Internet no responde pone los pelos de punta a cualquiera. Así que, durante una larga temporada, al menos, se hará imprescindible saber manejar las comunicaciones directas desde el ordenador a algún elemento externo: otro ordenador, un lector de barras, un autómata, etc.

Por otro lado, si nuestro enfoque es hacia Internet, nada mejor que saber cómo funcionan las comunicaciones por el puerto serie para poder realizar aplicaciones completas que utilicen los protocolos de Internet. Desde otro punto de vista, el incremento en la velocidad de las comunicaciones, léase ADSL, podría suponer un aumento en la demanda de aplicaciones que intercambien datos entre ordenadores en ‘tiempo real’ a través de las líneas telefónicas.

Ignoro hacia dónde irán los tiros en el futuro pero no es difícil imaginar que puedan realizarse aplicaciones que manejen los diferentes elementos de una casa, oficina o cualquier otro lugar de trabajo u ocio, a través de un ordenador central al que se conectarán los equipos a controlar.

Por mi parte, de todas las aplicaciones que he realizado, aquellas que más satisfacción me han proporcionado han sido las que me han permitido controlar objetos de ‘fuera’ a través de la caja tonta. Se siente una especie de mágica fascinación al conseguir controlar algún objeto externo a través de la manipulación de una imagen en el monitor.

Si uno repasa el API de comunicaciones de Windows verá que hay alrededor de una treintena de funciones para el manejo de los puertos. Si esto se compara con, por ejemplo, las funciones de archivo o el OLE, parece que implementar un sistema de comunicaciones en Windows debe ser una tarea simple. Sin embargo, esto es un engaño: las comunicaciones serie son muy poco ‘amables’ con el programador y las funciones de Windows se quedan, en la mayoría de los casos, cortas. Si a esto se une el hecho de la poca documentación existente o, mejor dicho, de la forma en que está esparcida esta información, nos encontramos con un panorama desalentador cada vez que necesitamos implementar un sistema de comunicaciones bajo Windows.

Este primer artículo tiene el propósito de sentar las bases para poder entender el funcionamiento de las comunicaciones desde un ordenador. Su continuación nos llevará a la creación de varias clases de arropamiento que nos permitan controlar cualquier comunicación serie desde nuestras aplicaciones. Aunque el código se enfoca hacia el manejo de las comunicaciones desde Windows, la teoría, que es de lo que trata este artículo, se aplica por igual a cualquier otro sistema operativo para ordenadores PC, léase Linux.

Pasajes

Los puertos serie han existido desde épocas arcaicas (mi primer ordenador ya los tenía) pero, curiosamente, la literatura sobre su manejo y funcionamiento siempre ha estado plagada de palabras raras, incomprensibles excepto, me imagino, para aquellos que las inventaron.

Establecer una comunicación es sinónimo de sacar bits de información del ordenador al exterior. Para ello, hace falta que exista un canal hacia el exterior, por ejemplo, un cable conectado al ordenador. Así, podemos transmitir un bit poniendo o quitando una carga eléctrica en la conexión (aquí no nos preocuparemos de cómo se realiza el proceso de carga y descarga, ya que eso es cosa de los componentes electrónicos).

Si, en vez de un solo cable, ponemos varios juntos, podremos trasmitir más bits a la vez. Esto es lo que sucede con la comunicación en paralelo: se dispone de hasta 8 hilos con lo que pueden transmitirse otros tantos bits simultáneamente. Sin embargo, no todos son ventajas: el sistema de 8 hilos, debido a determinados factores asociados al medio de transmisión, como la impedancia, pierde información rápidamente (¿alguna vez se ha preguntado por qué es tan corto el cable de la impresora?) y, por otro lado, más hilos significa más cobre, es decir, mayor carestía en los tendidos eléctricos.

Se pueden solventar algunos de estos problemas si se utilizan menos hilos. La comunicación serie requiere sólo dos cables, lo cual la hace más barata a costa de transmitir menos información: se transmite bit a bit. Sin embargo, aún nos enfrentamos al otro problema: la información se va perdiendo con la distancia: las características impuestas por la norma internacional RS-232 limita la distancia de conexión a 15 metros o menos. Para solucionar este problema podrían situarse unos repetidores de señal o regeneradores a lo largo de la línea lo que nos lleva de nuevo al primer problema: comunicaciones caras.

Sin embargo, las personas pueden comunicarse mediante la línea telefónica a largas distancias sin ninguno de esos problemas. Entonces, ¿por qué no utilizar el tendido telefónico? Claro que su uso nos enfrenta a otro problema: la red telefónica es analógica (la información viaja en forma de ondas) y lo que se pretende transmitir es digital. Para solucionarlo, necesitaríamos un dispositivo que transforme la información que queremos transmitir en forma digital a analógica: a este proceso se le denomina modulación. La llegada de la información a destino requeriría de otro dispositivo que convirtiese la señal analógica a digital, esto es que demodulase la señal. Pues bien, este dispositivo es el módem: un modulador-demodulador de señal.

Los buenos servicios

Dado que existen muchos fabricantes de ordenadores y de dispositivos que pueden conectarse a los mismos (ratón, módem, impresora,…), existen unas normas internacionales que regulan la forma en que los distintos elementos deben comportase para el establecimiento de las conexiones. La norma más conocida y utilizada en los ordenadores es la denominada RS-232. Aunque existen normas más modernas y que evitan algunos de los problemas que supuso la adopción de la norma RS-232, ésta se sigue utilizando debido a que la inmensa mayoría de los fabricantes la implementan en sus equipos.

Figura 1. Circuitos de la interfaz RS-232 para el conector de 25 patillas

La norma RS-232 establece tres aspectos de la comunicación:

1.- La descripción física o mecánica de los conectores: si deben ser machos o hembras y el número de patillas de cada uno a ambos lados de la conexión. Un ordenador dispone, generalmente (puede variar de un ordenador a otro), de un conector paralelo hembra de 25 patillas, un conector serie macho de 25 patillas, denominado conector 25D (ver figura 1) y un conector serie macho de 9 patillas, denominado conector 9D (figura 2). Los módem internos simulan las patillas serie.

2.- La descripción funcional de los conectores que indica lo que significa cada tipo de señal y la patilla por la que debe viajar. En las figuras 1 y 2 se han indicado las señales que viajan por cada patilla según esta norma. Algunas de las señales, como la de tierra (contacto 1 y 7 en 25D y 5 en 9D), no son interesantes para nuestros propósitos. Las señales que utilizaremos en la comunicación las veremos más adelante. Observando la figura 1 se verá que algunos circuitos del conector 25D están duplicados: los denominados en la figura como ‘secundarios’. Esto es debido a que algunos módem pueden mantener dos canales simultáneamente.

Figura 2. Circuitos de la interfaz RS-232 para el conector de 9 patillas

3.- Las características de las señales eléctricas: voltaje, intensidad, etc. Las propiedades del medio de transporte (el cable) junto con estas especificaciones hacen que no sea posible realizar conexiones serie que superen los 15 metros. En este punto también se indica cómo interpretar el estado activo y el inactivo: el estado activo de una señal, esto es, hay señal, se corresponde con el estado binario 0 y se le conoce con el nombre de espacio; el estado inactivo de la señal se corresponde con el estado binario 1 y se le conoce con el nombre de marca.

Las puertas del cielo

La conexión directa entre ordenadores o entre un ordenador y un elemento externo (cámara de vídeo, PLC, sensor, autómata, etc.), puede realizarse mediante un dispositivo especial, denominado módem nulo, que no es mas que un cable al que se le han cruzado determinados hilos. De esta forma, podemos realizar una conexión desde el puerto paralelo de un ordenador al puerto paralelo del otro, del puerto serie de 9 patillas al puerto serie de 9 patillas (figura 3-a), del puerto serie de 25 patillas al puerto serie de 25 patillas (figura 3-b), y del puerto serie de 9 patillas al puerto serie de 25 patillas del otro (figura 3-c). Ya que el tema que nos ocupa son las comunicaciones serie, las conexiones paralelo no se tendrán en cuenta aquí.

Figura 3. Módem nulo: (a) conexión 9D-9D. (b) conexión 25D-25D. (c) conexión 9D-25D

Aunque los módem nulos pueden encontrarse en las tiendas, cualquiera que sea un poco manitas puede fabricarse este dispositivo partiendo de un cable serie y siguiendo las indicaciones de la figura 3 (los números que aparecen en la figura se refieren a los de las figuras 1 y 2). Hay otras formas de cruzar los cables para creación de un módem nulo que no se muestran y que, por ejemplo, permiten elaborar un módem nulo para realizar un bucle local (se envían datos al puerto y se recogen del mismo) y, por ejemplo, realizar un test de lo que recibirá el programa remoto.

Ha de entenderse que, de alguna forma, un módem nulo engaña al ordenador haciéndole creer que, tras la puerta serie se encuentra un módem. Por tanto, algunas de las características que obtendremos de un módem real no son aplicables al módem nulo (por ejemplo, nunca recibiremos una llamada telefónica).

El establecimiento de una conexión requiere que un ordenador o Equipo terminal de datos, ETD (en inglés, DTE, Data Terminal Equipment) envíe los datos a un Equipo de terminación de circuito de datos, ETCD (en inglés, DCE, Data Communications Equipment) que es el encargado de transformar la información del ETD emisor en otras susceptibles de ser enviadas al ETD distante: un módem es un ETCD. El lado receptor deberá realizar estas operaciones en el sentido inverso. En un módem nulo no existe el ETCD, esto es, no se realiza la transformación de la señal: la información viaja en forma binaria y así es recogida por el ETD receptor.

Se verá, a continuación, la interpretación de las señales de cada una de las patillas de los conectores de tal forma que se entienda, por un lado, su labor y, por otro, el fundamento del cruce de cables que se produce en el módem nulo (ver las figuras 1 y 2 para la referencia de patillas).

GND (Protective Ground). Tierra de protección. Contacto 1 del conector 25D. Suele estar conectado al chasis del equipo o a una toma de tierra externa. Para nuestros propósitos es superfluo.

SG (Signal Ground). Tierra de señal. Contacto 7 del conector 25D y 5 del conector 9D. Es el conector de tierra y debe tener siempre una tensión de 0 voltios. En la práctica, en los conectores de 25 patillas se suele unir al contacto 1 (GND) formando una señal de tierra común. Tampoco es interesante para nuestros fines (el que monte el cable sí debe preocuparse de que vaya a tierra).

TD (Transmitted Data). Transmisión de datos. Contacto 2 del conector 25D y 3 del conector 9D. También es conocido con las siglas TXD. Este contacto es utilizado para transmitir las señales de datos desde el equipo terminal (ETD) al módem (ETCD). Cuando no se está transmitiendo, este contacto debe mantener la señal lógica 1 (marca).

RD (Receive Data). Recepción de datos. Contacto 3 del conector 25D y 2 del conector 9D. También es conocido con las siglas RXD. Los datos que va demodulando el módem los envía al terminal por este contacto. Si el módem no tiene datos, debe mantener este contacto no activo, esto es, con la señal lógica 1 (marca).

La razón de que en el módem nulo crucemos este cable con el TD (en las figuras 3 (a) y (b), el 2 con el 3 y el 3 con el 2 y, en la figura 3 (c), el 2 con el 2 y el 3 con el 3) es que mientras el equipo emisor envía por el canal TD, el receptor debe recibir por el canal RD. El controlador del puerto (del que hablaremos más adelante), nos enviará un evento cuando este contacto cambie indicándonos que tenemos algún byte esperando a ser leído.

RTS (Request To Send). Petición de envío. Contacto 4 del conector 25D y 7 del conector 9D. La señal de este conector es enviada desde el terminal (ETD) al módem (ETCD) para preparar al módem para la transmisión (¿puedo enviar?). De alguna manera, esta señal siempre debe ser la primera que se activará antes de comenzar el envío de datos en cualquier conexión. Sin embargo, no se debería comenzar la transmisión hasta no recibir la confirmación por parte del módem mediante una señal CTS.

CTS (Clear To Send). Preparado para transmitir. Contacto 5 del conector 25D y 8 del conector 9D. Cuando el módem recibe una señal de petición de envío (RTS), si está listo activa esta patilla para indicarle al terminal que puede comenzar a enviar datos cuando lo desee. Esta señal y la anterior (RTS) sirven, pues, para el control de la comunicación desde el PC. Para que las señales RTS/CTS sean válidas en una comunicación, se ha de activarse el control de flujo hardware RTS/CTS (del que hablaremos más adelante) para la transmisión o salida de datos.

Los circuitos RTS y CTS se cruzan en un módem nulo indicando algo así como ‘el módem estará preparado para transmitir (CTS) siempre que el terminal remoto esté preparado (RTS)’. En la figura 3 puede verse cómo se unen el conector RTS (7 en la figura 3 (a) y (c) izquierda; 4 en la figura 3 (b)) con el conector CTS (8 en la figura 3 (a); 5 en la figura 3 (b) y (c) derecha) del equipo remoto.

DSR (Data Set Ready). Módem preparado. Contacto 6 de ambos conectores, 25D y 9D. Indica el estado del módem: cuando está activa (valor lógico 0 o espacio), indica que el módem está conectado a la línea y que, por tanto, está listo para transmitir. En una comunicación, lógicamente, debe estar siempre activo ya que, de no ser así, indicará que se ha producido un corte en la línea telefónica (si la estamos usando), que se ha desconectado el cable que nos une al otro ETD (PC,…) o que el ETD remoto se ha apagado.

DTR (Data Terminal Ready). Terminal de datos preparado. Contacto 20 del conector 25D y 4 del conector 9D. Cuando está activa esta señal, le indica al módem que el terminal está encendido y listo para la comunicación. Si se desactiva la señal, el módem cortará la comunicación. Sirve, pues para controlar la conexión a la línea telefónica o al terminal remoto. Esta señal y la anterior (DSR) sirven, pues, para el control de la comunicación hacia el PC (ETD). Para que estas señales sean válidas hay que activarse el control de flujo hardware DTR/DSR (del que se hablará más adelante) para la recepción o entrada de datos.

Los circuitos DSR y DTR se cruzan en un módem nulo indicando algo así como que ‘el terminal estará listo para recibir (DTR) siempre que el módem remoto esté preparado (DSR)’. En la figura 3 puede verse cómo se unen el conector DSR (6 en la figura 3 (a), (b) y (c) izquierda) con el conector DTR (4 en la figura 3 (a); 20 en la figura 3 (b) y (c) derecha) del equipo remoto.

CD (Carrier Detect). Detección de portadora. Contacto 8 del conector 25D y 1 del conector 9D. También se le conoce con el nombre de detector de la señal de línea recibida, RLSD (Receive Line Signal Detector) o como detección de portadora de datos, DCD (Data Carrier Detect). Este circuito indica que el módem está recibiendo una señal del equipo remoto (cuando se realiza una conexión a Internet por medio del acceso telefónico a redes, la detección de esta señal se muestra en pantalla con el mensaje ‘conectado a un equipo remoto’ o algo similar). En un módem externo, se puede ver la luz CD encendida en el momento en que se produce este evento.

Puede entenderse esta señal como el ‘diga’ que utilizamos en una conversación telefónica. Lógicamente, antes de comenzar a enviar datos, la señal debe estar activa (normalmente, no comenzamos a hablar por teléfono hasta que nos responden al otro lado de la línea) y debe estar en ese estado a lo largo de toda la conexión (no continuamos hablando si nos cuelgan el teléfono): el módem cortará la conexión por pérdida de portadora (carrier lost) si se deja de recibir esta señal. En el proceso de conexión, la señal nos es válida para saber en qué momento podemos iniciar el envío o recepción o si se ha cortado la línea (en cuyo caso, deberíamos de parar el envío o recepción).

RI (Ring Indicator). Indicador de llamada. Contacto 22 del conector 25D y 9 del conector 9D. Este circuito indica que se está recibiendo una llamada y es utilizado por aquellos módem que están en modo de respuesta automática (lo veremos enseguida). En ese momento, el software debería indicarle al módem que descuelgue y genere una señal de portadora (esa serie de ruidos que se oyen al comenzar cualquier conexión a Internet).

Hay otras dos señales que no aparecen en los contactos de 9 patillas aunque sí en los de 25:

CG (Quality Detector). Detector de calidad. Contacto 21. Esta señal permanecerá activa (señal lógica 0 o espacio) si la calidad de la conexión es aceptable y el módem la pondrá en estado inactivo (señal lógica 1 o marca) cuando no sea así.

CH/CI (Data Signal Rate Detector). Selector de velocidad. Contacto 23. Al detectarse una mala calidad en la línea el módem pondrá inactiva la señal CG. Si el problema persiste durante un tiempo, el terminal le puede indicar al módem que cambie la velocidad a una más baja poniendo en estado inactivo la patilla 23 (CH/CI). Si, posteriormente, la calidad de la línea sube, el módem lo indicará activando la señal CG. En ese momento, el terminal puede indicarle al módem que suba la velocidad activando la patilla 23 (CH/CI).