Está en la página 1de 23

Transmisin serie: RS232.

1.- Motivacin y Objetivos.


RS232 es el nombre del interfaz de comunicacin serie ms utilizado del mundo. La norma serie est disponible en prcticamente el 99% de los ordenadores. Entre ellos el IBM PC compatible que habitualmente est equipado con dos puertos serie RS232, uno de ellos utilizado para conectar el ratn. El Apple Macintosh es una notable excepcin, utilizando otra norma serie, la RS422. La norma RS232 fue originalmente diseada para conectar terminales de datos con dispositivos de comunicacin (como modems y AITs). Desde un principio, fue tambin utilizada para conectar casi cualquier dispositivo imaginable. Los usos de la RS232 en el entorno domstico son muchos y ampliamente conocidos. Desde la conexin del ratn, el modem/fax, agendas electrnicas de bolsillo, impresoras serie, grabadores de memoria (tipo EPROM), digitalizadores de vdeo, radios de AM/FM, etc. La lista slo est limitada por la imaginacin de los diseadores. En el entorno industrial el peso de la RS232 es tambin muy importante. Si bien existen soluciones de comunicacin serie ms robustas y verstiles, como la RS422 o la RS475, la RS232 sigue siendo por su sencillez, su diseo econmico y, sobre todo, por su gran difusin, la norma ms frecuente. As, es fcil ver cmo robots industriales, manipuladores, controles de todo tipo, utilizan la RS232. Existen hasta cafeteras industriales (de las utilizadas en bares y restaurantes) que disponen de una RS232 para ser conectadas a un PC e informar de cuntos cafs han hecho en el transcurso del da, permitiendo al gerente de la empresa un control de caja, estadsticas de uso, etctera. Los objetivos que se pretenden en este captulo son: v Comprender el funcionamiento de la norma RS232, v Capacitar al alumno en el diseo e implementacin de aplicaciones que utilicen la RS232. No es objetivo de este captulo (ni de la asignatura) manejar la RS232 a nivel hardware. Por lo tanto no se entra en diseos hardware, ni programacin a nivel de registros del chip UART. Estos son objetivos de otra asignatura, en concreto de Sistemas de Transmisin de Datos (STD) optativa del 9 semestre. Organizacin del captulo. Los puntos 2 a 8 tratan los aspectos tericos y conceptuales de la transmisin serie y de la norma RS232. La exposicin no pretende ser exhaustiva pero s suficiente para obtener conceptos claros. La comprensin de estos puntos debe capacitar al lector a poder utilizar y configurar programas especializados en el uso de la RS232, como es el caso de los "emuladores de terminal" tipo PROCOMM+, TELIX, HYPERTERMINAL de Windows95, etc. El manejo de este tipo de programas, junto con algunas herramientas HW, como probadores RS232, resultan de una ayuda inestimable en la comprobacin y deduccin de los parmetros operativos de puertas RS232 en equipos de los que no se dispone de documentacin alguna (caso este desgraciadamente muy frecuente). Los puntos 9 y 10 tratan del diseo y desarrollo de programas que manejan la RS232. El punto 3 aborda la programacin clsica desde MS-DOS y en el punto 4 la programacin desde Windows95 y WindowsNT. Para este ltimo se han elegido como herramientas de desarrollo Transmisin serie - 1

libreras del tipo VCL (Visual Component Library). En concreto la MSCOMM32.OCX de Microsoft. Esta librera est disponible en MS Visual Basic 4.0 y versiones posteriores. La librera puede ser utilizada sin problema por otros compiladores para el desarrollo rpido de aplicaciones (RAD, Rapid Application Development), como Borland Delphi (Pascal) y Borland C++ Builder. La experiencia previa en programacin, y en especial en programacin con herramientas RAD, facilitar la comprensin de los ejercicios propuestos. El lector dispone, en el apndice A, de una sencilla introduccin y ejemplo de desarrollo de una aplicacin en Borland C++ Builder.

2.- Transmisin serie/paralelo.


Conceptualmente una transmisin paralelo consiste en utilizar simultneamente varios circuitos de transmisin serie. Dejando al margen problemas especficos de una transmisin en paralelo, como puede ser el efecto crosstalk o interferencia inducida de smbolos, la transmisin paralelo es el recurso lgico cuando un solo circuito no proporciona un ancho de banda suficiente. Si en un diseo, un problema de transmisin puede resolverse (a coste similar) con una transmisin serie, esta opcin es en principio deseable frente a una paralelo. Pinsese que en una transmisin con mltiples circuitos la probabilidad de fallo de lnea y la necesidad de mantenimiento es proporcional al nmero de lneas utilizadas.

3.- Transmisin sncrona/asncrona


Independientemente de si la transmisin es serie o paralelo, sta puede ser sncrona o asncrona. Para entender la diferencia es interesante fijarse en la etimologa de las palabras. Ambas vienen del griego cronos --tiempo (reloj)--. Sncrona significa "mismo reloj" y asncrona lo contrario, es decir, relojes distintos. Entre dos equipos, emisor y receptor, existe un problema bsico en la identificacin de los distintos smbolos (bits en este caso) que se transmiten por una lnea de transmisin. Supongamos dos computadores A y B, y una lnea de transmisin por la que se comunican. Supongamos que A manda a B 50 bits a una velocidad de 1000 bits/segundo. Esto quiere decir que cada bit estar en la lnea de transmisin una milsima de segundo. La mquina B necesita conocer este dato y necesita un reloj, o base de tiempos, que le permita medir con precisin esa milsima de segundo para saber cundo sta en la lnea el segundo bit, el tercer bit, etctera. El lector debe conocer que la forma normal en que el equipo receptor decide si un bit es "0" o "1" es muestreando (haciendo un muestreo de) la lnea de transmisin durante el intervalo del bit, preferiblemente a mitad del intervalo. Es evidente que si el reloj utilizado por el receptor no mide el tiempo con precisin y la secuencia de bits es lo suficientemente larga, entonces cometer un error en el muestreo de la lnea e identificar una secuencia de bits incorrecta. Si, por ejemplo, el reloj receptor atrasa y cuando indica al sistema que ha pasado 1 mseg. en realidad ha pasado 1,1 mseg. (un error del 10%, sin duda un poco exagerado) entonces se producir un primer error de muestreo en el 6 a 7 bits transmitido (si asumimos que el primer bit lo muestre correctamente en el centro del intervalo del bits) (ver figura).

Transmisin serie - 2

La figura muestra claramente cul es el problema. Debe quedar claro que aunque el planteamiento del ejemplo hace culpable al reloj del receptor, en una situacin real encontraremos que, de usar dos relojes, es imposible garantizar que ambos midan el tiempo (batir segundos) exactamente igual. Y aunque el error entre ambos sea mucho menor, ntese que si la secuencia de bits es lo suficientemente larga, el error de muestreo terminar por ocurrir. Problema: determinar la diferencia (error) mxima admisible entre los relojes del emisor y receptor para transmitir un carcter de ocho bits (suponemos existe un mecanismo que permite siempre leer el primer bit de cada carcter correctamente). De esta situacin se pueden deducir dos conclusiones: 1.- La transmisin sncrona (emisor y receptor comparten el mismo reloj) permite que el receptor pueda interpretar (muestrear) sin error de sincronismo una secuencia (bloque) arbitrariamente larga de bits. 2.- La transmisin asncrona, a diferencia de la sncrona, esta orientada a la transmisin de caracteres (bloque mnimo de tan slo siete u ocho bits). En la transmisin sncrona... cmo se hace para que ambos computadores usen un nico reloj? 1.- Si se utiliza el reloj de una de las dos mquinas (o un reloj tercero) se puede transmitir la seal de reloj por una lnea auxiliar a la otra mquina. La figura muestra como a partir de la seal de reloj el muestreo es siempre exacto.

2.- El emisor puede utilizar una codificacin para los datos de las denominadas "auto-reloj", como por ejemplo el cdigo Mnchester (utilizado p.e. en redes locales Ethernet). La figura muestra una secuencia de bits codificada en cdigo Mnchester. Transmisin serie - 3

Se puede observar que la codificacin Mnchester tiene la propiedad de que existe siempre una transmisin en la mitad del intervalo del bit. El receptor aprovecha esta propiedad para sincronizarse en cada bit. Es como si hubiera un reloj entre los datos que marca el ritmo del muestre que debe hacer el receptor, de ah el nombre de auto-reloj. En la transmisin asncrona,... Cmo se hace para sincronizar al principio de cada carcter?. Cuando el emisor no transmite, en el periodo entre caracteres, la lnea se mantiene a "1" lgico. Cuando decide transmitir un carcter, primero transmite un "0" que se denomina bit de START y sirve para que el receptor sincronice (empieza a contar tiempos desde ese momento). El instante de sincronismo es el flanco de bajada de la seal (ver figura). Tras el bit de START se transmiten los bits de datos y despus es obligatorio al menos un bit de STOP a "1" lgico. La secuencia se repite tantas veces como caracteres se transmitan. Obsrvese que este mecanismo de sincronizacin con el bit de START impide que la deriva de muestreo por diferencias entre los relojes contine en el siguiente carcter. Se asume que la deriva de muestreo no debe ser tan grande que provoque un error de muestreo en los bits de cada carcter.

4.- RS232
La norma serie RS232 fue diseada para conectar DTEs (Data Terminal Equipment) o equipos terminales de datos (como un terminal, un ordenador,...) con DCEs (data communication equipment) o equipos de comunicacin de datos, como modems, codecs, AITs, etctera. La diferenciacin entre DTE y DCE es fundamental para la comprensin de la norma como se ver ms adelante. La RS232 permite la transmisin sncrona y asncrona. La subnorma asncrona es sin duda la ms frecuente por lo que nos centraremos en ella. Transmisin serie - 4

La transmisin asncrona se lleva a cabo tal y como se describe en el punto anterior. En concreto adems del bit de START utiliza: - 5, 6, 7 o 8 bits de datos, - 0 o 1 bit de paridad (la paridad puede ser "par"(Even), "impar"(Odd), "siempre a cero"(Reset) y "siempre a uno"(Set). - 1, 1.5 o 2 bits de STOP. Para agilizar el lenguaje se suele emplear una nomenclatura abreviada como, por ejemplo, "8N1" que indica que la transmisin serie RS232 se ha configurado para transmitir 8 bits de datos, No paridad y 1 bit de STOP. Otro ejemplo sera "6E2" que indica 6 bits de datos, paridad par y 2 bits de STOP. El estndar RS232 normaliza los aspectos mecnicos, elctricos y funcionales. Mecnicos: La RS232 utiliza un conector Cannon DB-25 (ISO 2110) macho para el DTE y hembra para el DCE (ver figura).

La conexin entre DTE y DCE es simple. Cada pin conecta con su par (el 1 con el 1, el N con el N) existen versiones de DB-25 para cable plano que simplifica el mecanizado de las conexiones. Cada pin tiene asignado una funcin tal y como se muestra en la figura. Los nombres de las lneas estn puestos desde el punto de vista del DTE. As, el pin 2 es la lnea TxD (transmisin de datos) pero obviamente eso no es cierto en ambos equipos, slo en el DTE. En el DCE, por el contrario, es la lnea por la que recibe los datos del DTE. Cuando slo se utiliza la transmisin asncrona, slo es necesario utilizar nueve lneas. Se puede utilizar el conector Cannon-DB-9. Igualmente el macho es el DTE y la hembra el DCE. (Desgraciadamente esta norma, y otras de la RS232, no siempre es seguida por todos los fabricantes, razn por la cual no siempre es fcil manejar esta interface).

La imagen muestra un conjunto de conectores DB-25 machos (arriba-izda.) y hembras (arriba-centro). Tambin pueden observarse conectores DB-9 (ratn) y dispositivos adaptadores DB-25 a DB-9 (abajo), uno de ellos con un probador de RS232. Transmisin serie - 5

La longitud mxima del cable entre DTE y DCE depende de la calidad de ste y de la velocidad de transmisin utilizada. En principio la norma recomienda que no sea superior a 15 metros para una velocidad de 20 Kbits/seg.

Elctrica:

Transmisin serie - 6

La subnorma elctrica de la RS232 es la V28. La norma fija una transmisin en modo comn (cada circuito tienen una referencia a tierra y esta es comn para todos los circuitos). Los circuitos son punto a punto, es decir, un driver con un slo receptor de la seal. La seal es bipolar con lgica invertida, utilizando los siguientes valores: 1 lgico =-3 a - 15 voltios 0 lgico = + 3 a + 15 voltios La ausencia de seal (0 voltios) queda diferenciado del 0 y 1 lgicos. La RS232 es cortocircuitable. Esto quiere decir que, al menos tericamente, los drivers de salida de las puertas disponen de un mecanismo de auto-proteccin contra sobrecalentamientos. La tensin mxima de operacin es +/-25voltios y la carga mxima es de 3 Kohm. a 7 Kohm., con una corriente mxima de 500 mA.

Funcional: (sobre norma asncrona ) La norma asncrona la forman nueve lneas.

La lnea GND conecta la masa de ambos equipos y no merece mayor comentario. Las restantes ocho lneas pueden ser agrupados en tres bloques funcionales que se explican fcilmente si recordamos que la norma fue diseada para conectar un PC (DTE tpico) con un modem (DCE tpico).

Primer bloque: Lo denominaremos "de establecimiento de conexin". Est formado por las lneas: Transmisin serie - 7

DTR (Data Terminal Ready). Terminal de datos preparado. (El PC y su RS232 estn listos). DSR (Data Set Ready). Equipo de comunicacin preparado. (El modem est listo). RI (Ring Indicator). Indicador de llamada. (El modem indica a su PC que ha recibido una llamada).

El objetivo es que ambos PCs sepan que se ha establecido un canal de comunicacin (normalmente a travs de la lnea telefnica). Las lneas DTR y DSR del equipo local y del remoto deben estar activas (set) durante todo el proceso. (De hecho cuando un PC desea dar por terminada una conexin basta con que, momentneamente, desactive (reset) su DTR). La conexin se inicia manualmente (el usuario llama con el telfono al modem remoto) o automticamente (el modem tiene capacidad de marcar un nmero de telfono dialling ) y se gestiona en los modems (que negocian, de forma automtica, los parmetros de transferencia como la velocidad, compresin, etc). Se asume que el usuario del PC que llama activar el proceso que va a utilizar la conexin (un programa de transmisin de ficheros, por ejemplo). En el PC llamado se asume que el proceso homlogo est ya activo (porque, p.e., lo est permanentemente) o se puede activar automticamente al recibir de su modem la seal de RI. Sea como fuera, la conexin queda establecida. A partir de este momento los PCs pueden intercambiar informacin. Segundo bloque: "Control de flujo". Estas lneas tienen sentido en el caso de que el canal de comunicacin establecido tenga una gestin half-duplex (ver a continuacin gestin simplex, half-duplex y full-duplex...). Si el canal est establecido, el protocolo software de nivel de enlace de datos que se est utilizando (Xmodem, Ymodem, HDLC,...) fijar cul de los dos DTEs debe comenzar a hablar/transmitir. Las lneas en este bloque son usadas de la siguiente manera: RTS (Request To Send). Peticin de transmisin. El PC indica a su modem que quiere transmitir a la mquina remota. CTS (Clear To Send). Canal libre para la transmisin. El modem indica a su PC que puede transmitir. Previamente habr transmitido una seal portadora por el canal de comunicacin para avisar al otro modem que ocupa el canal. DCD (Data Carrier Detected). Detectada portadora. El modem indica a su PC que el canal de comunicacin est ocupado por el equipo remoto.

El PC que quiere transmitir activa RTS, entonces su modem manda una seal portadora (sin modular, sin datos) para avisar al modem remoto que se reserva el canal. Una vez reservado el canal comunica a su DCE que ya puede transmitir activando la lnea CTS. Cuando un PC haya terminado de transmitir, desactivar RTS, el modem quitar la portadora y desactivar CTS. Entonces el otro modem podr reservar el canal si su PC desea transmitir.

Transmisin serie - 8

En caso de que la gestin del canal sea full-duplex todo es ms sencillo. Cuando un PC quiere transmitir activa su RTS. Automticamente su modem le da paso activando CTS.

Tercer Bloque: Transmisin/recepcin de datos. El funcionamiento de las lneas de este bloque es obvio. Cuando un PC puede transmitir, lo hace por la lnea TxD. Transmisin de datos.

...y si est recibiendo datos lo hace por RxD. Recepcin de datos

La transmisin serial de los datos, tal y como se ha explicado, con el bit de START, de STOP, etctera, se produce en estas lneas.

5.- Gestin Simplex, Half-duplex y Full-duplex de un canal de comunicacin.


Un canal de comunicacin puede ser gestionado de tres maneras: simplex, semi-duplex (o half-duplex) y duplex (o full-duplex). Simplex: La comunicacin slo es posible en un sentido. Por ejemplo, las emisiones de radio o televisin gestionan el ter en modo simplex. Half-duplex: La comunicacin es posible en ambos sentidos pero de modo alternado, nunca simultneamente. Por ejemplo un walkie-talkie gestiona el ter en modo half-duplex. Full-duplex: La comunicacin es posible en ambos sentidos simultneamente. Por ejemplo los telfonos mviles utilizan el ter en modo full-duplex. Debe quedar claro que se trata de un modo de gestin del canal, no de una propiedad de ste. En los ejemplos queda claro que un mismo medio, el ter, puede ser gestionado de modos distintos.

6.- Conexionado DTE-DTE: Null-Modem.


Como ya se ha mencionado, es frecuente que la norma RS232 se utilice para otros propsitos distintos de los originales. Uno de los ms frecuentes es conectar un DTE con otro DTE. En este caso el cableado normal DTE a DCE no tiene sentido y estaramos cortocircuitando las lneas de salida. Existe una solucin, un cableado cruzado que se conoce como Null-modem. Es fcil de entender si lo analizamos usando los tres bloques funcionales. Bloque 1: Conectar DTR con DSR remoto y RI remoto. De esta manera cuando un PC activa su RS232 se lo comunica al remoto. Bloque 2: RTS con CTS local y DCD remoto. Transmisin serie - 9

Para entender la lgica de este cableado debe observarse (ver figura a continuacin) que hay dos lneas independientes de transmisin de datos, una en cada sentido. Por lo tanto la comunicacin es potencialmente Full-duplex. Esto implica que cada DTE puede transmitir cuando lo desee, independientemente de que el otro DTE lo est haciendo o no. Por lo tanto cuando un PC quiere transmitir activa su RTS, esto activa tambin su propia CTS lo que le permite transmitir inmediatamente. Adems indica que est transmitiendo a la mquina remota activando el DCD remoto.

Bloque 3: TxD con RxD remoto. Es obvio!. Como habamos mencionado, la comunicacin es potencialmente Full-Duplex.

7.- Terminales y emuladores de terminal.


Una terminal es un conjunto formado por un teclado, una pantalla y un interfaz serie (tpicamente RS232) que permite conectar ambos a un ordenador central o host. El terminal en s no posee ninguna capacidad de clculo, se limita a sacar por pantalla la informacin que recibe del host y a transmitir al host la informacin/comandos introducida por teclado. Cada vez son menos frecuentes estos equipos. En su lugar se utiliza un ordenador personal con un programa de emulacin de terminal (como el TELIX, el PROCOMM+, el HYPERTERMINAL de Windows95, etc.). Un terminal puede ser Full-Duplex (FD) o Half-duplex (HD) en funcin de como proceda para mostrar por pantalla las pulsaciones del teclado. Si la pantalla recibe directamente del teclado el cdigo a visualizar entonces es HD (ver dibujo). El modo FD es algo ms complejo pues requiere la participacin del host. Consiste en que el host haga eco de la informacin que Transmisin serie - 10

recibe del teclado. De esta forma el cdigo pulsado "va y viene" al/del host antes de ser mostrado en pantalla (y de ah que se denomine terminal full-duplex).

La ventaja del mtodo FD es que permite al usuario comprobar si ha habido error de transmisin. Si el cdigo en pantalla es el deseado, tambin es el que ha ledo el host. Esto no pasa en HD. Si en HD existiera un error de transmisin y el cdigo de la tecla pulsada no llega o llega mal al host, el usuario no puede, en principio, saberlo .

8.- Control de flujo con RS232


Existen dos posibilidades de control de flujo de datos con la RS232: Una hardware mediante las lneas RTS/CTS (que ya se ha descrito) y otra software XON/XOFF. RTS/CTS: la lnea CTS indica al PC si puede transmitir o no. En aplicaciones como la conexin de un PC a una impresora serie (dispositivo este normalmente bastante lento) la lnea CTS est gobernada por la impresora para impedir que el PC desborde su buffer de entrada . XON/XOFF: Otra posibilidad es usar el protocolo software XON/XOFF que consiste en lo siguiente: 1 Cuando la impresora est dispuesta para recibir datos (buffer de entrada vaco o casi vaco) transmite al PC la marca XON (XON y XOFF son cdigos ASCII predefinidos). 2 Si el PC transmite demasiado rpido para la impresora y el buffer est prximo a llenarse, entonces se manda la marca XOFF. 3 El PC transmite slo si la ltima marca recibida fue XON. Dependiendo de las caractersticas de los equipos a conectar se puede hacer un control de flujo RTS/CTS, XON/XOFF, ambos o ninguno. Cuando se utilizan ambos, normalmente es porque hay que controlar dos buffers de recepcin, el del dispositivo fsico (UART), que se hace por RTS/CTS, y el buffer de la aplicacin que est recibiendo los datos, que se hace con XON/XOFF.

Transmisin serie - 11

9.- Programa de Emulador de terminal (MS-DOS)


A continuacin se muestra un programa sencillo, pero completo, de un emulador de terminal. Para probarlo sera necesario conectar dos mquinas por la RS232 y ejecutar el mismo programa en ambas mquinas. Tambin puede conectarse un modem al PC y usar el programa para mandar comandos al modem y conectarse a un host remoto. El programa funcionara como un terminal tipo dump (de volcado de datos simple). Tambin se proporciona el cdigo de los mdulos de librera de uso de la RS232 utilizados. El desarrollo de estos mdulos escapa de los objetivos de este captulo puesto que se necesitan tener conocimientos del hardware utilizado. En concreto del chip Intel UART 8250 o del National 16450 16550 (los tres son compatibles a nivel de programacin de registros). El cdigo est disponible en la WEB de la asignatura REDES-1. La direccin es: zoltar.redes.upv.es
------------------------------------------------------------------------------#include <stdio.h> #include <stdlib.h> #include "serie.h" #include <conio.h> void main (){ int fin,cod; int ch; int halfduplex; halfduplex= .... //1=true, 0=false=fullduplex clrscr(); //borrar pantalla openrs(COM1); //configura la COM1 a 2400bps. 8N1 fin = 0; while (fin==0){ if (kbhit){ //Ver si se ha pulsado el teclado ch = getchar(); if (ch==27) fin = 1; //Si escape --> finalizar el programa if (halfduplex) putchar(ch); //AQUI ESTA LA DIFERENCIA ENTRE HALF Y FULL DUPLEX!. putrs(ch); //transmite el cdigo del teclado por la RS232 } cod = getrs(); //Lee de la RS232 if (cod != -1) putchar(cod); // Si hay algo... lo saca por pantalla if (cod==27) fin = 1; // Si llega el cdigo de escape terminar } closers(); //Vaciar la RS232 clrscr();

Transmisin serie - 12

Modulos de librera de manejo de la RS232. Serie.h


/* Definicion del modulo serie.h */ /* Copyright: Miguel Sanchez */ #define COM1 1 #define COM2 2 void void void void int openrs(int Port); closers(); confrs(unsigned long Velocidad, int Paridad, int LongPalabra, int BitsStop); putrs(int ch); getrs();

Serie.c
/* Copyright: Miguel Sanchez */ #include <dos.h> #include <stdlib.h> #include <time.h> const const const const const MaxBuf=4095; baseCom1=0x3f8; // Direccin base de E/S del COM1 baseCom2=0x2f8; // Direccin base de E/S del COM2 n1=0xc; // Vector de interrupcin asociado al COM1 n2=0xb;// Vector de interrupcin asociado al COM2

typedef struct fifo { char data[4095]; int head,tail; } fifo; fifo outbuf,inbuf; void interrupt (*oldv) (void); int base, n; double tasa=0; int invtasa; //-------------------------------------------------------------int vacio(fifo *Cola){ if (Cola->head==Cola->tail) return(1); else return(0); } //-------------------------------------------------------------int lleno(fifo *Cola){ if (Cola->head>=Cola->tail) if (Cola->head-Cola->tail < MaxBuf) return (0); else return(1); else if (Cola->tail-Cola->head > 1) return(0);

Transmisin serie - 13

else return(1); } //-------------------------------------------------------------void poner(fifo *Cola, int ch){ if (!(lleno(Cola))) { Cola->data[Cola->head] = ch; Cola->head = (Cola->head+1) % (MaxBuf+1); } } //-------------------------------------------------------------int leer(fifo *Cola){ int dato; if (vacio(Cola)) return(-1); else { dato = Cola->data[Cola->tail]; Cola->tail=(Cola->tail+1) % (MaxBuf+1); return(dato); } } //-------------------------------------------------------------void initcola (fifo *Cola){ int i; Cola->head=0; Cola->tail=0; for (i=0;i<=MaxBuf;i++) Cola->data[i] = 0; } //-------------------------------------------------------------void putrs(int ch){ if (tasa > 0) { if (random(1/tasa)<1) poner(&outbuf,(ch | 0xAA)); else poner(&outbuf, ch); } else poner(&outbuf,ch); outportb(base+1, 3); } int getrs(){ return(leer(&inbuf)); } //-------------------------------------------------------------void confrs(unsigned long Velocidad,int Paridad,int LongPalabra,int BitsStop){ unsigned long Divisor,BAL,BAH,LCR,IER; outportb(base+1, 0); outportb(0x21, 0); /* desactiva interrupciones UART */ /* */

Divisor=115200 / Velocidad ; BAL = Divisor % 256; BAH = Divisor / 256; LongPalabra = (LongPalabra-5) & 3; BitsStop = ((BitsStop-1) & 1)*4;

Transmisin serie - 14

Paridad = (Paridad & 3)*8; LCR = Paridad+BitsStop+LongPalabra; IER = 3; /* Interrupciones TX y RX */ outportb(base+3, 128); outportb(base+0, BAL); outportb(base+1, BAH); outportb(base+3, (LCR & 0x7f)); outportb(base+4, 0xb); outportb(base+1, IER); } //-------------------------------------------------------------void interrupt INTRS(void){ int IIR,LSR; char ch; IIR = 0; while ((IIR & 1) != 1) { IIR = inportb(base+2) & 7; LSR = inportb(base+5); switch (IIR / 2) { case 0: /* modem */ break; case 1: /* TX vaco */ { if (!(vacio(&outbuf))) outportb(base+0, leer(&outbuf)); else outportb(base+1, 1); break; } case 2: /* RX ha llegado */ { ch=inportb(base+0); if (!(lleno(&inbuf))) poner(&inbuf,ch); break; } case 3: /* errores */ break; } } outportb(0x20, 0x20); } //------------------------------------------------------------void openrs(int Port){ switch (Port) { case 2: base = baseCom2; n = n2; break; default: base = baseCom1; n = n1; } outportb(base+1, 0); initcola(&inbuf); initcola(&outbuf); oldv = getvect(n); setvect(n,INTRS); confrs(2400,0,8,1); }

Transmisin serie - 15

//---------------------------------------------------------------void closers(){ while (!(vacio(&outbuf))); /* espero a que se vacie el buffer */ setvect(n,oldv); outportb(base+1, 0); }

10.- Programa de manejo de la puerta serie RS232 desde Windows95/NT


El primer paso es familiarizarse con el componente MSCOMM que proporciona el manejo de la puerta serie. Este objeto esta disponible en VBasic 4.0 y versiones superiores y puede instalarse para ser manejado con Delphi, Borland C++ Builder y en general con cualquier lenguaje de programacin que utilice libreras VCL (OCX, DirectX, etc.). Para instalarlo es necesario tomar el fichero MSCOMM32.OCX de VBasic y copiarlo al directorio WINDOWS/SYSTEM y, en el lenguaje de programacin elegido, se debe ejecutar el proceso correspondiente de aadir componentes. El objeto tiene un nico gestor de eventos y gran multitud de propiedades, adems de funciones (mtodos), constantes, etctera. La programacin bsica la realizaremos con: El gestor ONCOMM que maneja los eventos (llega un carcter, cambia el valor de una lnea, etctera) y los errores (error de paridad, desbordamiento del buffer de recepcin, bit...), y con ... Las propiedades: 1 CommPort: Fija la COM (1, 2, 3 o 4) que vamos a utilizar. 2 Setting: Fija los parmetros operativos de la puerta RS232 (p.e. "2400,N,8,1" es decir, velocidad de transmisin 2400, No paridad, 8 bits de datos y 1 bit de stop). 3 PortOpen: Activa el puerto especificado en CommPort. 4 OutPut: Transmite los caracteres que se le indique. A continuacin se han incluido las ayudas que proporciona el sistema para este objeto (fichero de ayuda CTRLREF.HLP --> Ayuda de controles personalizados --> Controles del sistema --> Control Communications). Tngase especial atencin al gestor de eventos ONCOMM y las propiedades indicadas. Tambin se ha incluido un programa sencillo de ejemplo realizado con este componente.

Transmisin serie - 16

Transmisin serie - 17

Transmisin serie - 18

Los ejemplos que proporciona el fichero de ayuda estn en BASIC. Recurdese que el mdulo de manejo de la puerta serie se tom de Microsoft Visual Basic).

Transmisin serie - 19

Programa ejemplo en Borland C++ Builder


A continuacin se muestra un programa muy sencillo de ejemplo de uso de la RS232 utilizando Borland C++ Builder y la librera MSCOMM32.OCX. El primer paso sera disear la esttica de la aplicacin. Tomamos un form y sobre el colocamos los objetos que van a formar parte de la aplicacin. La figura muestra una propuesta posible. El icono con el telfono es el objeto TCOMM1 que maneja la puerta serie, tambin se han utilizado dos ventanas del tipo Tmemo (Memo1 y Memo2) para mostrar lo que se recibe por la RS232 y lo que tecleamos que ser lo que se transmite. La parte de abajo muestra un conjunto de buttons, combo-box y radio-buttons que servirin para fijar el modo operativo de la puerta serie (estos ltimos objetos estn sin cdigo en el ejemplo). Evidentemente el diseo de la aplicacin es una propuesta muy mejorable, tanto desde el punto de vista funcional como desde el punto de vista esttico. Sugerimos que el alumno haga su propio diseo.

El programa no puede ser ms simple. Disponemos de tres rutinas: 1 FormCreate que activa la puerta serie seleccionada (directamente en la ventana de propiedades) 2 Memo2KeyPress que se activa cuando escribimos algo en el objeto Memo2, y lo que hace es transmitirlo por la RS232 utilizando la propiedad Output 3 MSComm1Comm que maneja los eventos CommEvent. Slo se trata el evento comEvReceive que recoge lo que se recibe por la puerta RS232

Transmisin serie - 20

Transmisin serie - 21

11.- Ejercicio.
(1) Se propone al lector que rehaga este programa ejemplo y lo mejore aadiendo una interfaz de configuracin de la puerta RS232 completo, donde se pueda elegir la puerta, la velocidad de transmisin, etctera.

12.- Bibliografa.
1 Captulo 5: La interfaz en las comunicaciones de datos de W. Stallings, COMUNICACIONES Y REDES DE COMPUTADORES (5 edicin), Ed.: Prentice-Hall (1997).

Transmisin serie - 22

También podría gustarte