Está en la página 1de 3

Programacin de los puertos Seriales

Preparado por: J. Huircan


Departamento de Ingeniera Elctrica
Universidad de La Frontera
Abril 2012

Introduccin
El cdigo fuente que se presenta permite la comunicacin serial va RS232 entre dos computadores. Este
programa fue desarrollado en TurboC 2.0, sin embargo para propsito de experimentacin puede ser
utilizado y modificado.
Este cdigo fue realizado usando la clsica funcin de la BIOS int 14h (o en C int 0x14), para ello se
considera la programacin de los registros de la CPU en forma directa, cuya arquitectura corresponde a la
basada en x86 (8088, 8086, 80286, etc.) con la cual fue construido el antiguo PC.
La int 14h bsicamente es una funcin cuyas variables de ingreso son los registros AH, AL, DX, esto de
acuerdo a la Tabla 1. Los valores de salida de la funcin quedarn en el registro AX.
Tabla 1. Valor del Registro AH
AH
0
1

Funcin
Inicializa puerto de
comunicaciones
Enva carcter sobre la lnea

Leer caracter de la lnea

Leer palabra de estado del


puerto de comunicaciones

Registros Entrada
DX = # del puerto serie (0 1)
AL = Parmetros de Inicializacin. (ver tabla 2)
DX = # del puerto (0 1)
AL = Caracter a enviar
DX = # del puerto (0 1)

Registro Salida
AX = Estado
AH = Estado de la linea: Bit 7 =1, si
caracter no tx
AL = Caracter ledo
AH = Estado de la lnea
Si AH no es 0 es que ha ocurrido error
AX = Palabra de estado
AH = Estado de la lnea
AL= Estado del modem

Tabla 2. Detalle del registro AL


Bits
b7-b5

Contenido
Velocidad (baudios):

b4-b3

Paridad

b2

Bits de stop

b1-b0

Largo del Carcter

Valores
000=110
001=150
010=300
011=600
100=1200
101=2400
110=4800
111=9600
X0 = ninguna
01 = impar
11 = par
0 = 1 bits
1 = 1.5 bits (si el largo del caracter es 5)
1 = 2 bits (si el largo del caracter es 6, 7 u 8)
00=5
01=6
10=7
11=8

El uso de la int 14h requiere de la configuracin de los registros de acuerdo a la tabla 1 y2, as se inicializan
los registros con los valores ad-hoc y luego se ejecuta la funcin int 14h.

Configuracin de los registros


Considerando el puerto COM1, 1200bps, un dato de 8 bit, sin paridad y un bit de stop, entonces se tiene
DX=0, lo que define el COM1.

Protocolos de Comunicacin 2012

El registro AL, de acuerdo a los bits de la Tabla 2, 1200bps = 100, Sin paridad=00, 1bit stop=0, 8 bits
Largo del dato =11, luego AL=0x83 (en binario 10000011).
Se configura AH=0, para configurar, AH=1 para escribir, AH=2 para leer y AH=3 para leer el estado de lnea.

Implementacin en TurboC
La implementacin en Turbo C, realizada a principio de los 90, contempla la ejecucin de la funcin
interrupcin, llamada int86(numint, registros entrada, registros de salida), en la cual se
usa numint=0x14, el conjunto de registros de entrada y el conjunto de registro de salida, esto a travs de
una estructura REGS.
La aplicacin consta de cuatro funciones y un modulo principal. El mdulo principal inicializa el puerto, lee el
estado de la recepcin, si es verdadero entonces lee el dato y lo imprime en pantalla. Luego lee el estado del
teclado, para detectar alguna accin del usuario. Si la tecla ingresada corresponde al ESC (carcter 0x1b o
27), el programa termina.
#include
#include
#include
#include

<dos.h>
<stdio.h>
<stdlib.h>
<conio.h>

union REGS rent, rsal;


void ini_rs232()
{
rent.h.ah=0x00;
/* Inicializacin */
rent.x.dx=0x00;
/* COM1 */
rent.h.al=0x83;
/* 1200 bps, sin par, 1 bit stop, 8 bit datos */
int86(0x14,&rent,&rsal);
}
void escribe(char c)
{
rent.h.ah=0x01;
/* Funcin escribir */
rent.x.dx=0x00;
/* COM1 */
rent.h.al=c;
/* Escribe caracter c */
int86(0x14,&rent,&rsal);
}
int test_rs()
{
rent.h.ah=0x03;
/* Lee status de lnea */
rent.x.dx=0x00;
/* COM1 */
int86(0x14,&rent,&rsal);
return(rsal.h.ah & 0x01); /* Retorna bits menos significativo */
}
char leer_rs()
{
rent.h.ah=0x02;
rent.x.dx=0x00;
int86(0x14,&rent,&rsal);
return(rsal.h.al);
}

/* Funcin Leer dato */


/* COM1 */
/* Retorna el dato en AL */

void main()
{
int st;
char c;
ini_rs232();
while(1)
{
st = test_rs();

/* Inicializacin RS-232

*/

/* Lee estado de la lnea */

if(st)
{
c = leer_rs(); /* Lee dato */
putchar(c);
}

Protocolos de Comunicacin 2012

if(kbhit())
{
c = getch();
if( c == 0x1b) exit(0);
escribe(c);
/* Escribe Caracter */
}
}
}

Compatibilidad del cdigo


Respecto de la compatibilidad, este programa puede correr en Windows pero en la consola de comandos.
Eventualmente Windows puede tener comportamiento inestable.
Referencias
[1] Leblanc, G. Turbo C para IBM-PC y Compatibles, ED. Gustavo Gili, 1988

Protocolos de Comunicacin 2012

También podría gustarte