---------TUTORIAL DE manejo del puerto serie---------
____________________by_fernando_martinez_©2008_
___tamaño de la palabra___
bit 0
bit 1
___Numero de stop___
bit 2
___paridad___
bit 3
bit 4
___velocidad___
bit 5
bit 6
bit 7
por ejemplo 231h = 11100111b
significa:
tamaño de palabra: 8bits
2 bits de stop
paridad nula
9600 velocidad de transmision.
86h = 10000110b
significa:
7 bits tamaño de palabra
2 bits de parada
paridad nula
1200 valocidad de transferencia.
_______________________________________
-------------------- para inicializar el puerto ----
_______________________________________
en ensamblador:
mov ah, 00h ; funcion de la interrupcion para configurar el puerto
mov al, 231h ; nuestra configuracion
mov dx, 3F8h ; la direccion del COM1 por ejemplo
int 14h
en C:
/* turbo c utiliza la funcion int86 declarada la siguiente forma:
int int86(int intno, union REGS *inregs, union REGS *outregs); */
void inicializar_puerto(int puerto, unsigned char code)
{
union REGS r;
r.x.dx=puerto;
r.h.ah=0;
r.h.al=code;
int86(0x14,&r,&r);
}
_______________________________________
----------------------para enviar un caracter ------
_______________________________________
ensamblador:
mov dx,3f8 ;puerto; p.e. el puerto COM1
mov al,car ;caracter a inviar
mov ah,01h ;funcion para enviar caracter
int 14h
en C:
void envia_caracter(int puerto, char car)
{
union REGS r;
r.x.dx=puerto;
r.h.al=car;
r.h.ah=0x01
int86(0x14,&r,&r);
}
________________________________________
-----------------------para recibir un caracter -------
________________________________________
ensamblador:
mov dx, 3F8
mov ah, 02h
int 14h ; en al se encuentra el caracter leido
en C:
int lee_puerto(int puerto)
{
union REGS r;
r.x.dx=puerto;
r.h.ah=0x02
int86(0x14,&r,&r);
return(r.h.al);
}
se puede controlar si hubo error en la lectura (tambien en la escritura) añadiendo:
if (r.h.ah & 128) printf("Error de lectura. \n");
_____________________________________
------------------------para chequear estado-----
_____________________________________
ensamblador:
mov dx, puerto
mov ah,03h
int 14h
en C:
int chequea_puerto(int puerto)
{
union REGS r;
r.x.dx=puerto;
r.h.ah=3
int86(0x14,&r,&r);
return(r.x.ax);
}
obs:
AH estado del puero serie
AL datos
si alguno de los bits del registro de estado esta en 1 ha ocurrido un error.
por eso podemos comprabar errores de la siguiente forma:
if(!(chequea_puerto(3F8)&256)) printf("Error\n");
__________________________
greeting to all asm coders---------
__________________________