Sunteți pe pagina 1din 7

Comunicaciones seriales en Lenguaje C.

En lenguaje C, existe una instruccin especial para manejar las comunicaciones seriales. Esta instruccin posee la siguiente sintaxis: int bioscom (int cmd, char abyte, int port); En realidad, esta instruccin acude a la interrupcin 14H para permitir la comunicacin serial sobre un puerto. Para este caso, cada uno de los parmetros tiene el siguiente significado: cmdEspecifica la operacin a realizar abytes un caracter que se enviar por el puerto serial e port es la identificacin del puerto serial (desde 0 para COM1 hasta 3 para COM4)

El parmetro cmd puede tener los siguientes valores y significados: 0 Inicializa el puerto port con los valores dados por abyte 1 Enva el caracter abyte por el puerto port 2 Lee el caracter recibido por el puerto port 3 Retorna el estado del puerto port Para la inicializacin del puerto, el caracter abyte tiene las interpretaciones que se muestran en la siguiente Tabla. 0x02 0x03 0x00 0x04 0x00 0x08 0x18 0x00 0x20 0x40 0x60 0x80 0xA0 0xC0 0xE0 7 bits de datos 8 bits de datos 1 bits de parada 2 bits de parada Sin paridad Paridad impar Paridad par 110 baudios 150 baudios 300 baudios 600 baudios 1200 baudios 2400 baudios 4800 baudios 9600 baudios

Para configurar el puerto con algunos parmetros, bastar con realizar una operacin OR con los

deseados, por ejemplo, para 1200 baudios, sin bit de paridad, sin bit de parada y 8 bits, bastar con selecconar la palabra dada por: abyte = 0x80 | 0x00 | 0x00 | 0x03 o lo que es equivalente, abyte = 0x83 Para la lectura de un caracter que se haya recibido o del estado del puerto, se deben utilizar variables en las cuales se almacenarn los valores de retorno; en ambos caso se obtienen valores de 16 bits. Para la lectura de un dato recibido, los 8 bits menos significativos corresponden al dato y los 8 ms significativos al estado del puerto; si alguno de estos ltimos est en "1 ", un error ocurri; si todos estn en "0", el dato fue recibido sin error. Cuando el comando es 2 3 (leer el caracter o el estado del puerto), el argumento abyte no se tiene en cuenta. Para configurar el puerto COM1 con los parmetros del ejemplo dado anteriormente, bastar con la instruccin: bioscom (0,0x83,0); /*(inicializar, parmetros, COM1)*/ La utilizacin de los comandos y las instrucciones para la configuracin de los puertos aqu expuestos slo tendrn sentido en la medida en que utilicemos el puerto serial para establecer una comunicacin bien con otros computadores o bien con dispositivos electrnicos como microcontroladores.

Comunicacin con el puerto paralelo en Lenguaje C.


El lenguaje C permite tanto la lectura como la escritura de los puertos paralelo. Para leer el puerto existen las instrucciones inport e inportb, mientras que para escribir estn las instrucciones outport y outportb. La sintaxis de estas instrucciones es la siguiente: unsigned unsigned char void void inport (unsigned portid); inportb (unsigned portid); outport (unsigned portid, unsigned value); outportb (unsigned portid, unsigned char value);

Ejemplo: Palabra = inport(puerto); outport (puerto,Palabra); Byte = inportb (puerto); outportb (puerto,Byte); Las instrucciones que terminan en b ese refieren a la lectura o escritura de un byte, mientras que las que no terminan en esta letra se refieren a una palabra(dos byte). La variable puerto debe contener la direccin de memoria del puerto paralelo, este valor puede ser 378h, 3BCh 278h. Por ultimo no hay que olvidar colocar la siguiente directiva del preprocesador que le indica al C que se usarn las funciones inport, outport, inportb u outportb, declaradas en el archivo dos.h. #include <dos.h>

El siguiente programa consulta la direccin del primer puerto paralelo disponible: #include <conio.h> #include <dos.h> void main(void) { int puerto; clrscr(); puerto=peekb(0x40,0x8); printf("Direccin: %Xh",puerto); getch(); } Como vern la utilizacin del puerto paralelo es mucho ms sencillo que la serial. Referencias utilizadas: 1.- Naranjo C. , Jhon Jairo. Electronica & Computadores."Interface serial RS-232". Ao I N10. Pag. 71-76 2.- Naranjo C. , Jhon Jairo. Electronica & Computadores."Kinder de programacin en C". Ao I N9. Pag. 71-76

MAS NOTAS IMPORTANTES:

1) Todas las rutinas de esta seccin estn escritas en lenguaje PASCAL (ni modo, cuando yo escrib todo esto, todava no saba lenguaje "C" ). Sin embargo no debe ser muy difcil la conversin. La sintaxis de los comandos para leer y escribir datos del puerto (cortesa de Luis Roberto Muiz) son: char var1 = inport (unsigned int port); outport (unsigned int port, char var2); Y hay que utilizar la librera dos.h 2) Estas rutinas van a funcionar solamente si el programa corre en una sesin de DOS. Ocasionalmente Windows (la versin que sea) se porta medio egosta con los puertos y no deja accesarlos directamente. Si no les permite ejecutar el programa desde una ventana, van a tener que "rebootear" la mquina en DOS. Comencemos: Este puerto se comunica con el mundo mediante una conexin con 25 hoyos pequeos que est detrs de casi todas las PC, y que se utiliza generalmente para conectar la impresora (de hecho para eso fue diseado originalmente [Van Gilluwe, 94] ). Este tipo de conexin es llamado "DB 25 hembra" (Las siglas "DB" significan "Data Bus"). Los puertos paralelos han permanecido casi igual desde las primeras PC. Se han hecho algunas extensiones a su funcionamiento, pero siempre respetando la compatibilidad con los modelos anteriores. El modelo de puerto paralelo que se describe aqu es el modelo estndar, de modo que su funcionamiento es vlido para cualquier tipo de PC. Este modelo es unidireccional (significa que cada pin es de entrada o salida, pero no ambos), y puede transmitir 150 Kbytes por segundo. Esto es (repetimos) el estndar de puerto paralelo que se ha usado desde las XT. Actualmente ya puede alcanzarse una respetable velocidad de 2 Mega bytes por segundo, y con bidireccionabilidad en los puertos. Sin embargo, se pretende aqu definir globalmente algo que pueda funcionar por igual en todas las PCs, y no solamente en los modelos ms nuevos. Si se desea experimentar con estos puertos extendidos (los bidireccionales), ser necesario investigar primero las especificaciones particulares de la mquina. El "Enhanced Parallel Port", por ejemplo, slo est presente de los modelos 386SL y 486SL en adelante. Ok, Ok, alguien preguntar: "pero para qu quiero aprender a hacer robots compatibles con puertos paralelos tan anticuados y obsoletos? y aparte en DOS! ya no se usa!". Muchachos, tomen en cuenta que no siempre la escuela les va a poder prestar tan facilmente una Pentium III de 500 Mhz con Windows 2000 para sus primeros experimentos de robtica. As que es mejor que puedan hacer que su robot funcione en cualquier mquina. De todos modos, las instrucciones para la programacin de los puertos paralelos ms avanzados pueden encontrarse en cualquier libro reciente (de 1993 en adelante) sobre arquitectura de las PC. Un libro recomendado para ello es "The Undocumented PC", de Frank van Gilluwe.

La siguiente figura muestra el diagrama de un puerto paralelo estndar. El dibujo muestra la salida del puerto tal y como se ve al estar viendo a la computadora desde atrs (de todos modos, los nmeros de los pines estn grabados ah mismo en la conexin. Slo tienen que mirarla muy de cerquita). Este es el diagrama que se encontrara en la mayora de los manuales tcnicos. Como puede verse, est especficamente diseado para la impresora. Las flechas que salen del puerto son los comandos que se envan a sta (salto de hoja, inicializacin, seleccin, habilitacin), y tiene una entrada para cada seal que la impresora puede mandar: error, impresora no seleccionada, impresora ocupada, sin papel, y "reconocimiento" (ACK).

Como se puede ver en el diagrama, el puerto est enfocado especficamente al manejo de la impresora. Esto nos da un total de doce bits de salida y cinco bits de entrada, lo cual es una desafortunada combinacin desde el punto de vista de la comunicacin paralela. Podemos mandar perfectamente un byte (8 bits) de datos al exterior, pero tenemos que recibirlo en trozos.

Direccionamiento del puerto.


Existe un comando para entablar comunicacin directa con cualquiera de los puertos de la PC (no solamente los paralelos). Este comando se llama "Port" (en lenguaje PASCAL), y para enviar datos a un puerto en particular se utiliza con el siguiente formato: Port [ Direccin] := Algo; Y para leer informacin de un puerto (y guardarla a su vez en una variable) se utiliza de la forma: Variable := Port [ Direccin];

"Direccin" es un valor tipo "word" (16 bits) que indica una posicin de memoria en el mapa de puertos de la PC. A su vez, "Variable" es (precisamente) una variable tipo byte, y "Algo" es un valor (nmero o variable) tipo byte. Esto significa que la direccin del puerto puede ser un nmero cualquiera de 0 hasta 65535, mientras que los valores que se leen y escriben en el mismo slo pueden ir desde 0 hasta 255. Ahora bien, cmo se obtiene la direccin del puerto paralelo?. Pues esa direccin est colocada en una de las posiciones ms bajas de memoria: en la $0040:$0008 El signo de "$" significa que estos nmeros estn representados en hexadecimal, y los dos puntos de enmedio representan la separacin de la direccin en "segmento" y "desplazamiento". Esto significa: desde la posicin de memoria $40, muvete $8 espacios ms. Y ah es donde se tienen las direcciones base de todos los posibles puertos paralelos que haya.

Bytes de "Data", "Status" y "Control".


Debido a la poco comn configuracin de bits de entrada y salida que tiene, el intercambio de informacin con este puerto paralelo (el estndar) y el mundo exterior es ligeramente complicado. Sin embargo, una vez entendidos los principios bsicos de funcionamiento y con la lgica de programacin adecuada, no debe presentar mayores problemas. Estos 12 bits de salida y 5 bits de entrada estn agrupados en 3 bytes, conocidos ampliamente en la literatura computacional como los bytes "Data, Status y Control". Esto proviene del diseo original del puerto que, como ya se mencion, fue hecho pensando en la impresora solamente. El byte llamado "Data" son los 8 bits de datos de salida que mandan el caracter a la impresora. El byte de "Control" es para darle rdenes, y est formado por los 4 bits de salida solamente (los otro cuatro bits del byte no se utilizan). Y finalmente, el byte "Status" est formado por 5 bits de entrada que leen la condicin de la impresora (los otros bits tampoco se usan). Las siguientes figuras muestran cmo estn distribuidos estos bits en sus respectivos bytes. Cada puerto paralelo que exista en la PC estar caracterizado por estos tres bytes, aunque (obviamente) cada uno los tendr localizados en direcciones diferentes, segn el fabricante de la PC.

Funcin para investigar las direcciones.


Una vez revisada la teora bsica de funcionamiento del puerto, podemos ya proceder a su programacin. Y la primera rutina a utilizar deber ser siempre una rutina que nos d (al inicio del programa) las direcciones de esos bytes de "Data", "Status" y "Control". A continuacin se muestra una funcin (s, en Pascal) para realizar esta operacin. Function Investiga_Direcciones (Puerto:Byte; Var Data, Status, Control:Word):Boolean; Begin Data := MemW [$0040:(8+2*Puerto)]; Status := Data + 1; Control := Status + 1;

If (Data <> 0) Then Investiga_Direcciones:= TRUE; { S se consiguieron los datos } Else Investiga_Direcciones:= FALSE; { No se detect el puerto pedido } End; Como datos de entrada, esta funcin recibe el nmero de puerto del que se desea conocer las direcciones. NOTA: Los puertos se numeran partiendo del cero. Si yo quiero saber las direcciones del nico puerto paralelo de una computadora, deber llamar a la funcin pidindole los datos del puerto cero. Si se tienen dos puertos paralelos, el primero ser el puerto cero, el segundo ser el puerto uno, y as sucesivamente. A los puertos paralelos generalmente se les nombra con las letras "LPT" ms el nmero que le corresponda: "LPT0", "LPT1", "LPT2", etc... Si no existe el nmero de puerto pedido, la rutina regresar un "FALSE". En caso de s existir, regresar un "TRUE" junto con la direccin de los bytes correspondientes. De ahora en adelante, cada vez que se desee leer (o escribir) a un grupo de pines particulares del puerto, se utilizar la direccin del byte correspondiente, como se muestra: Port [Data] := Variable; { Manda el byte de "Data" } Variable:= Port [Status]; { Lee el byte de "Status" } Port [ Control ] := Variable; { Manda el byte de "Control" } Se debe tener cuidado con la lectura del byte de "Status". Recurdese que siempre se tendr basura en los tres bits menos significativos, puesto que no se utilizan. Esto se soluciona fcilmente mediante un filtrado lgico inmediatamente despus de la lectura: haciendo un AND de la variable con el nmero binario 11111000. Adems, tmese en cuenta que los bits de ERROR y de ACK se leen INVERTIDOS. Es decir, si algn aparato pone 5 volts en la patita del bit de ACK del puerto paralelo, nuestra rutina leer un cero en ese bit, y si el aparato pone esa patita a tierra (cero volts) la rutina leer un "uno".

Hardware adicional.
Otro punto importante a considerar cuando se realicen proyectos electrnicos que involucren este puerto, es el hecho de que el puerto paralelo (el estndar) tiene muy poca capacidad de corriente, aunque sus voltajes son perfectamente compatibles con TTL. Debido a esto, siempre es conveniente colocar un buffer a la salida del puerto para darle fuerza a la seal. Puedes usar, por ejemplo, el circuito integrado 74244, pero cualquier otro buffer puede servir.

S-ar putea să vă placă și