COM1和COM2初始化后,将COM2的MODEM控制寄存器(2FCH)的D0、D1位置1,使COM2的DTR、RTS有效,从而使COM1的DSR、CTS有效。程序显示的结果是0,说明发送正确。通过改变程序中宏定义COM的值,可以改变COM1的DSR、CTS信号有效的组合。结果表明,只有COM=3时,即DSR和CTS都有效时,BIOScom才能发送成功。当COM取1、2或0,即DSR、CTS分别有效或全无效时,程序显示8000,表明发送失败。
利用下列程序段对bioscom的接收功能进行测试:
# include″dos. h″
# include″bios. h″
# define COM 1
main ()
{int a ;
outportb (0x3fc ,0) ;
outportb (0x2fc ,0) ;
bioscom(0 ,0xa3 ,0) ;
bioscom(0 ,0xa3 ,1) ;
outportb (0x3fc ,COM) ;
outportb (0x3f8 ,65) ;
delay (10000) ;
a = bioscom(2 ,0 ,1) ;
printf (″%X , %c″,a &0x8000 ,a &0x00ff) ;
printf (″\ n″) ;
getch () ;
}
可以得出如下结论:当cmd=0时,bioscom函数对串口初始化,写通信线控制寄存器和除数寄存器,设置数据帧格式和波特率,并写中断允许寄存器,清除所有中断允许位,串口读写只能工作于程序查询方式,但不写MODEM控制寄存器;当cmd=1时,bioscom函数发送数据,改写MODEM控制寄存器,使DTR、RTS信号有效,并查询MODEM状态寄存器,等待DSR、CTS两个回答信号,只有在一定延时内,两个回答信号都有效才发送成功;当cmd=2时,bioscom函数接收数据,改写MODEM控制寄存器使DTR有效,并查询MODEM状态寄存器,等待DSR回答信号,同样需在一定延时内得到回答否则接收失败;当cmd=3时,bioscom函数读取通信线状态寄存器和MODEM状态寄存器,并返回。
弄清了bioscom函数的执行过程,就可以用左图所示的连接进行通信,使串口的DTR和DSR短接,RTS和CTS短接,这样,只要bioscom使DTR、RTS有效,便可得到所需的回答信号。在这种连接下,前面给出的不能通信的程序就可以正常通信了。
那么,能否用右图所示的简单三线连接进行计算机和单片机的串行通信呢,答案是肯定的。只要用上述程序中给出的inportb和outportb两个函数直接驱动8250即可,其说明如下:
unsigned char inportb (int portid) ;
void char inportb (int portid ,unsigned char value) ;
portid 是硬件端口地址;Value 是发送的字符数据。
下面是笔者编写的初始化、写串口、读串口函数。
void initcom(int com ,int bps)
{int co-a ,io-a ;
char ch ;
switch (bps)
{case 110 :ch = 0x03 ;break ;
case 150 :ch = 0x23 ;break ;
case 300 :ch = 0x43 ;break ;
case 600 :ch = 0x63 ;break ;
case 1200 :ch = 0x83 ;break ;
case 2400 :ch = 0xa3 ;break ;
case 4800 :ch = 0xc3 ;break ;
case 9600 :ch = 0xe3 ;break ;
default :ch = 0xa3 ;
}
co-a = (com - 1) ? 0x2fc :0x3fc ;
io-a = (com - 1) ? 0x2f8 :0x3f8 ;
bioscom(0 ,ch ,com - 1) ;
outportb (co-a ,0) ;
inportb (io-a) ;
}