串口芯片的简单理解
串口芯片的引脚如下:

内部结构如下:

上面两个图比较复杂,也似乎很难记住。其实,对于串口通信芯片,最关键的就是每块芯片有一根发送信号线和一根接收信号线,两块8251连接如图所示:

两块8251要进行通信,只要各自检查下面的两个引脚就行:
①TxRDY(Transmitter Ready):发送器准备好,高电平有效。如果该信号有效,就表示发送缓冲器已空,通知CPU可以向芯片送入新的数据。
②RxRDY(Receiver Ready):接收器准备好,高电平有效。如果RxRDY为高,表示接收缓冲器中已经有组装好了的一个数据字符,通知CPU读取数据。
如果都准备好了,再通过下面两个引脚发送和接收数据:
①TxD:发送数据线。
②RxD:接收数据线。

上图是进行通信的两块8251连接图:
初始化程序由两部分组成:
①将一方定义为发送方,发送方CPU查询到TxRDY有效时,则CPU向8251A并行输出一个待发送的字节数据;
②将对方定义为接收方,接收方CPU查询到RxRDY有效时,则从8251A输入一个已接收到的字节数据,直到全部数据传送完毕为止。
程序如下:
发送程序如下:
START:MOV DX,3F9H
MOV AL,7FH ;异步方式,8位数据,
;一位停止位,偶校验
OUT DX,AL 波特率因子为64,允许发送
MOV AL,11H ;操作命令字
OUT DX,AL
MOV DI,1000H ;设置地址指针
MOV CX,40H ;设置计数器初值
-----------------------------------------------------------------------------------------
程序到这里是设置芯片的工作状态,包括同步异步等。
L1: MOV DX,3F9H
IN AL,DX
AND AL,01H ;查询TxRDY是否有效
JZ L1 ;无效则等待
MOV DX,3F8H
MOV AL,[DI] ;向8251A输出一个字节数据
OUT DX,AL
INC DI ;修改地址指针
LOOP L1 ;未传送完,则继续下一个
HLT
--------------------------------------------------------------------------------
这一部分就是发送数据,很简单,TxRDY准备好了就发送。
接收程序如下:
BEGIN:MOV DX,3F9H
MOV AL,7FH ;异步方式,8位数据,1位停止位
OUT DX,AL ;偶校验,波特率因子64,允许接收
MOV AL,14H ;操作命令字(置ER,RxE 为1)
------------------------------------------------------------------------------
程序到这里也是设置芯片的工作状态,包括同步异步等。
MOV DX,AL
MOV SI, 2000H ;设置地址指针
MOV CX,40H ;设置计数器初值
L2:MOV DX,3F9H
IN AL,DX;读取状态字
TEST AL,38H ;查询接收器是否有错。
JNZ ERR ;有错则转错误处理
AND AL,02H ;无误则查状态位D1(RxRDY)
JZ L2 ;接收未准备好则等待
MOV DX,3F8H
IN AL,DX ;接受准备好,则接收1个字节数据
MOV [SI],AL
INC SI ;修改接收数据区地址
LOOP L2
JMP L3
ERR:CALL ERR-OUT(略)
L3:MOV AX,4C00H ;已接收完,返回DOS
INT 21H
--------------------------------------------------------------------------------
这一部分就是接收数据,很简单,RxRDY准备好了就接收。
因此,上述程序总结一下就非常简单:
1:设置芯片工作状态;
2:检查发送是否准备好,准备好则发送数据;
3:检查接收是否准备好,准备好则接收数据。