串口通信程序设计Word格式.docx
《串口通信程序设计Word格式.docx》由会员分享,可在线阅读,更多相关《串口通信程序设计Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
波特率因子寄存器是用来控制串行数据传输的数率。
波特率因子=1843200÷
(分频值×
16)内部设置波特率因子寄存器DLL/DLH,在初始化时将选用的波特率因子值的高低、低字节分别放入DLH和DLL中。
若设定通信波特率为1200bps,波特率因子寄存器的初始化程序为:
MOVDX,3FBH
MOVAL,80H
OUTDX,AL
MOVDX,3F8H
MOVAL,60H
MOVDX,3F9H
MOVAL,00H
2.2.2通信线路控制寄存器(LCR)
通信线路控制寄存器LRC主要用来指定异步通信数据格式,即字符长度、停止位位数、奇偶校验。
LRC的控制字如下
D7
D6
D5
D4
D3
D2
D1
D0
DLAB
SB
SP
EPS
PEN
STB
WLS1
WLS0
2.2.3通信线路状态寄存器
通信线路状态寄存器用来表示数据接收和数据发送时8250的状态。
控制字如下
TSRE
THRE
BT
FE
PE
OE
DR
2.2.4中断允许寄存器
中断源提出的中断请求被允许还是被禁止是由允许中断寄存器控制。
控制字格式如下
EMSI
ELSI
ETBEI
ERBFI
2.2.5中断识别寄存器
为了具体识别时哪种事件引起的中断,直到该中断请求被CPU响应并服务之后,才能接收其他的中断请求。
该寄存器为只读寄存器,内容格式为
ID2
ID1
IP
2.2.6调制解调控制寄存器
MODEM控制寄存器用来设置对MODEM的联络控制信号和芯片自检,寄存器的各位定义如下:
LOOP
OUT2
OUT1
RTS
DTR
2.2.7MODEM状态寄存器
Modem状态寄存器用来检测和记录来自Modem的联络信号及其状态变化。
此寄存器的各位定义为:
RLSD
RI
DSR
CTS
△RLSD
△RI
△DSR
△CTS
2.2.8发送保持寄存器和接收缓冲寄存器
发送时,CPU首先将待发送的字符写到8250的发送保持寄存器THR中,然后进入发送移位寄存器,在发送始终的作用下,从SOUT引脚输出。
一旦THR的内容送到发送移位寄存器TSR后,THR就变空,同时将LSR的THRE位置“1”,产生中断请求,要求CPU发送下一个字符。
CPU向THR写入下一个字符后,THRE位自动清“0”。
如此重复,直到全部数据发送完毕。
接收时,串行数据在接收时钟的作用下,从SIN引脚先输入到移位寄存器RSR,然后由RSR并行输入到接收缓冲寄存器RBR,一旦RBR变满,将LSR的DR位置“1”,产生中断请求,要求CPU读取数据字符。
CPU从RBR读取该字符后,DR位自动清“0”。
如此重复,直到所有的数据接收完毕。
2.3INS8250的各寄存器的地址
寄存器
COM1端口下的地址
COM2端口下的地址
THR
3F8H
2F8H
RBR
LSB
MSB
3F9H1
2F9H1
IER
3F9H
2F9H
IIR
3FAH
2FAH
LCR
3FBH
2FBH
MCR
3FCH
2FCH
LSR
3FDH
2FDH
MSR
3FEH
2FEH
3程序设计
3.1程序设计思路
根据设计要求,要实现通过串口进行通信,就必须有一个发送端和一个接收端,因此要编写两个程序,在发送端编写发送程序,在接受端编写接收程序。
发送PC机和接收PC机通过RS-232C的3根信号线(TXD、RXD、GND)进行相连。
我决定采用查询方式编写发送程序和接收程序。
编写接收程序的时候,首先要初始化段寄存器,设置发送缓冲区指针。
然后初始化8250,通过初始化8250来设置串口的参数。
再根据线路状态寄存器的内容,测试发送保持寄存器是否为空,如果不为空,继续读线状态寄存器的内容,判断发送保持寄存器是否为空,如果为空的话,读取按键字符并显示和发送它。
我事先规定当输入某一个字符的时候发送结束,这时候我就要判断按键是否为该字符,是该字符的时候结束程序。
编写接收程序的时候首先要设置接收缓冲区,设置接收错信息,初始段寄存器,设置接收缓冲寄存器地址指针然后初始化8250,初始设置和接收端的保持一置。
以上完成后开始接收,在屏幕上显示接收开始。
然后读线状态寄存器,判断是否接收错,在屏幕上显示接收错误,继续读线状态寄存器,如果接收无误,则测试接收数据是否准备好了,为准备好则循环测试,准备好了则接收字符。
判断接收的字符是否为规定的结束字符,如果是结束程序,如果不是显示字符。
两台机器的连接图如下。
3.2程序流程图
3.2.1发送端程序流程图
3.2.2接收端的程序流程图
3.3具体的程序
3.3.1发送端的程序代码
DATASEGMENT
DISPDB'
TRANSMISSIONSTART:
'
0AH,0DH,'
$'
DATAENDS
STACKSEGMENTPARASTACK'
STACK'
DB200DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVDX,3FBH;
置DLAB=1
MOVAL,80H
OUTDX,AL
MOVDX,3F8H;
置波特率因子寄存器
MOVAL,60H;
波特率因子低字节
OUTDX,AL
MOVDX,3F9H
MOVAL,0;
波特率因子高字节
置线路控制寄存器
MOVAL,0AH;
数据位7位,停止位1位、奇校验
MOVDX,3FCH;
置MODEM控制寄存器
MOVAL,02H;
禁止中断
MOVDX,3F9H;
置中断允许寄存器
屏蔽所有中断
MOVDX,OFFSETDISP;
显示发送提示信息
MOVAH,9
INT21H
LOP:
MOVDX,3FDH;
读线路状态寄存器
INAL,DX
TESTAL,20H;
测试发送保持寄存器
JZLOP;
不空,则循环测试
MOVAH,1;
读取按键字符并显示
发送该字符
CMPAL,'
P;
判断按下的字符是否为P
JZOVER;
是,则结束
JMPLOP;
不是继续循环
OVER:
MOVAH,4CH;
返回DOS
CODEENDS
ENDSTART
3.3.2接收端的程序源代码
RBUFDB30DUP(0)
RECEIVESTART:
ERRORDB'
RECEIVEERRO!
ASSUMECS:
LEASI,RBUF;
置接收缓冲区地址指针
置通信线路控制寄存器
数据位7位、停止位1位、奇校验
MOVDX,3FCH;
MOVAL,02;
显示接收提示信息
读接收缓冲器内容,不处理
TESTAL,1EH;
测试接收错误?
JNZER;
有,转错误显示
TESTAL,01H;
无,则测试接收数据准备好
JZLOP;
未准备好则循环测试
MOVDX,3F8H
ANDAL,7FH
判断接收结束吗?
JZOVER;
结束转OVER
MOV[SI],AL;
未结束则存入缓冲区
INCSI
MOVDL,AL;
显示该字符
MOVAH,02
JMPLOP
ER:
清标志位
MOVDX,OFFSETERROR;
显示错误信息
MOVDL,AL
MOVAH,2
CODE