Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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.
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.
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.
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.
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 .
Transmisin serie - 11
Transmisin serie - 12
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); }
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
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