很多单片机教材里提到了单片机和计算机串口通信的硬件和软件设计,给出了如右图所示的最简单的三线连接电路和BIOSINT14H的应用。笔者按照教材所述的方法进行了实验,但未成功。通过实验,发现在简单的三线连接电路中,INT14H不能用来通信,无法发送和接收。下面详细给出笔者采用的能实现通信的方法,供参考。
一、计算机串口编程
PC/XT计算机串口的核心是通用异步接收/发送器8250。附表是计算机串口的系统地址和8250内部寄存器的对应关系。DLAB(除数寄存器访问控制位)是通信线控制寄存器的D7位,当该位为1时,对地址3F8H(2F8H)、3F9H(2F9H)的读写是针对除数寄存器的,在此用途之外应使该位置0;接收缓冲器和发送保持寄存器的地址相同,由读写信号区分。
寄存器可以分为3类。发送保持寄存器和接收缓冲器用于暂存待发送数据或接收到的数据;通信线控制寄存器、除数寄存器、MODEM控制寄存器、中断允许寄存器用于设置和控制串口;通信线状态寄存器、MODEM状态寄存器、中断识别寄存器用来反映串口当前的状态。有关寄存器的设置,请读者查阅相关资料。
8250的初始化编程步骤如下:
1.将80H送通信线控制寄存器3FB(2FBH),使DLAB=1。
2.将分频系数送入除数寄存器,确定波特率3F9H(2F9H)、3F8H(2F8H)。
3.把D7=0的命令字送入通信线控制寄存器,确定一帧数据格式。
4.将中断允许命令字送中断允许寄存器3F9H(2F9H)。查询方式时为0H。
5.设置MODEM控制寄存器3FCH(2FCH),查询方式时D3=0,中断方式时D3=1,以允许8250送出中断请求。正常收发时应使D4=0,内环自检时使D4=1。
二、INT14H功能调用
INT14H功能调用的子功能如下:
功能号00H为初始化串口;
功能号01H为向串口写数据;
功能号02H为从串口读数据;
功能号03H为读取串口状态。
在C语言中,可以使用int86()等函数设置寄存器变量后,直接使用上述功能调用,但最简单的方法是用bioscom()函数,它的函数说明是intbioscom(iNTCmd,charabyte,intport)。其中,cmd是子功能号,abyte是初始化参数或待发送的字符,port是串口号。Cmd取0、1、2、3时,bioscom()的功能分别和INT14H的00H、01H、02H、03H子功能对应。无论cmd取何值,返回值的高8位对应INT14H出口参数中的AH,低8位对应AL。当cmd=0时,abyte为初始化参数;当cmd=1时,abyte是待发送数据;当cmd=2时,返回值的低8位是所接收到的数据;当cmd取1或2时,返回值的最高位为0,表示成功,否则失败;当cmd=3时,返回值为串口状态,高8位为通信线状态,低8位为MODEM状态。