参数com是串口号,COM1为1,COM2为2。bps是所需的波特率。这里是用BIOScom函数实现初始化的大部分功能。若按照前边给出的8250初始化步骤,可以用下列程序段对COM1进行初始化:
outportb (0x3fb ,0x80) ;
outportb (0x3f9 ,0) ;
outportb (0x3f8 ,0x30) ;
outportb (0x3fb ,0x03) ;
outportb (0x3f9 ,0) ;
outportb (0x3fc ,0) ;
下面是写串口函数和读串口函数:
void outcom(int com ,char ch)
{int st-a ,io-a ;
st-a = (com - 1) ? 0x2fd :0x3fd ;
io-a = (com - 1) ? 0x2f8 :0x3f8 ;
while ( ! (inportb (st-a) &0x20) ) ;
outportb (io-a ,ch) ;
}
int incom(int com ,char 3 ch)
{int st-a ,io-a ;
st-a = (com - 1) ? 0x2fd :0x3fd ;
io-a = (com - 1) ? 0x2f8 :0x3f8 ;
if (inportb (st-a) &0x01)
{ 3 ch = inportb (io-a) ;
return 1 ;}
else return 0 ;
}
outcom函数将ch从com指定的串口发送出去,incom函数从com指定的串口读取字符,若成功则返回1并改写ch单元。Incom函数不等待串口接收完毕,若无数据可读则立即返回,可以在主调函数中等待。
现在,我们可以用右图所示的连接进行计算机和单片机之间的串行通信了,使用如下程序可以实现通信的实验:
# include″dos. h″
# include″bios. h″
main ()
{int i ;
char ch = 65 ;
initcom(1 ,2400) ;
for (i = 0 ;i < 256 ;i + + )
{outcom(1 ,i) ;
printf (″%c″,i) ;
while ( ! incom(1 , &ch) ) ;
printf (″- %c″,ch) ;
}
printf (″\ n″) ;
getch () ;
}
该程序发送一个字符后,等待接收,若发送的字符和接收的字符一致,表明通信成功。
读者可以在此基础上定义通信协议,完成串口通信的功能。