写的串口通讯的初始化函数,其中其中多处有问题,请赐教!!!!
zk635 2003-10-09 07:34:13 下面是c写的串口通讯的初始化函数,其中其中多处有问题,请赐教!!!!
#define COM1_INT_NUM 0x0c
#define COM1_BASE_ADDR 0x03f8
#define COM1_MASK_BIT 0x10
#define COM1_TX COM1_BASE_ADDR /* send data register */
#define COM1_RX COM1_BASE_ADDR /* receive data register */
#define COM1_BL COM1_BASE_ADDR /* baudrate_LSB low byte */
#define COM1_BH COM1_BASE_ADDR+1 /* baudrate_MSB high byte */
#define COM1_IM COM1_BASE_ADDR+1 /* interrupt mask register */
#define COM1_IS COM1_BASE_ADDR+2 /* intr_status register */
#define COM1_LC COM1_BASE_ADDR+3 /* line control register */
#define COM1_MC COM1_BASE_ADDR+4 /* modem control register */
#define COM1_LS COM1_BASE_ADDR+5 /* line status register */
#define COM1_MS COM1_BASE_ADDR+6 /* modem status register */
int init_com(int comport,unsigned long combaudrate,unsigned char commode)
{
void set_com_mode(int port,unsigned long baudrate,unsigned char mode);
void com1_exit();
void com2_exit();
unsigned int far *com_addr;
disable();
com_addr=(unsigned *)0x00400000; /*0x00400000什么作用???*/
if(comport==1)
{
if(*com_addr==COM1_BASE_ADDR) /*COM1_BASE_ADDR=0x0f38*/
{
com1_oldvect=getvect(COM1_INT_NUM);
setvect(COM1_INT_NUM,com1_intr);
outp(0x21,inp(0x21)&~COM1_MASK_BIT); /*COM1_MASK_BIT=0x08*/ /*上面这句是什么意思*/
set_com_mode(comport,combaudrate,commode);
enable();
if(atexit(com1_exit))
return(FALSE);
else return(TRUE);
}
else
{
enable();
return(FALSE);
}
}
else
{
if(*++com_addr==COM2_BASE_ADDR)
{
com2_oldvect=getvect(COM2_INT_NUM);
setvect(COM2_INT_NUM,com2_intr);
outp(0x21,inp(0x21)&~COM2_MASK_BIT);
set_com_mode(comport,combaudrate,commode);
enable();
if(atexit(com2_exit))
return(FALSE);
else return(TRUE);
}
else
{
enable();
return(FALSE);
}
}
}
void set_com_mode(int port,unsigned long baudrate,unsigned char mode)
{
unsigned char baud_high,baud_low;
baud_low=(short)(115200L/baudrate)&0x00ff; /*?????*/
baud_high=115200L/baudrate>>0x08; /*?????*/
if(port==1)
{
outp(COM1_LC,0x80); /*????*/
outp(COM1_BL,baud_low);
outp(COM1_BH,baud_high);
outp(COM1_LC,mode&0x7f); /*mode=3?*/
outp(COM1_IM,0x01);
outp(COM1_MC,0x08);
inp(COM1_LS); /* 这几句又是什么意思*/
inp(COM1_RX); /* reset interrupt */
inp(COM1_IS); /* reset interrupt */
inp(COM1_MS); /* reset interrupt */
}
else
{
outp(COM2_LC,0x80);
outp(COM2_BL,baud_low);
outp(COM2_BH,baud_high);
outp(COM2_LC,mode&0x7f);
outp(COM2_IM,0x01);
outp(COM2_MC,0x08);
inp(COM2_LS);
inp(COM2_RX);
inp(COM2_IS);
inp(COM2_MS);
}
}