微机串口通信内环自检Word文件下载.docx
《微机串口通信内环自检Word文件下载.docx》由会员分享,可在线阅读,更多相关《微机串口通信内环自检Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
4)设置中断允许命令字:
查询方式,置中断允许命令字为0
中断方式,置中断允许寄存器的相应位为1
5)设置MODE控制寄存器
中断方式:
D3=1,允许8250送出中断请求信号。
查询方式:
D3=0内环自检:
D4=1正常通信:
D4=0
(1)辅串口内环自检
当8250设置为内环自检方式时,8250无法提出中断请求,而且引脚/TRS、/CTS、/DTR、/DSR在芯片内部似乎是被“切断”了。
有鉴于此,当8350设置为内环自检方式
的时候,只能采用查询方式,而且只能采用对端口直接操作的编程手段,完成数据的发送和接受。
【程序流程图】
(直接访问端口寄存器,如图3-19)
图3-19程序参考流程图
(2)双机通信
用串口电缆将两台机算机的COM连接起来,把计算机设置成空MODE方式,并为此编制了两个汇编语言程序:
其一为数据发送程序;
其二为数据接收程序。
为了确保每个字符发送出去,并且被接收,发送接收双方的波特率设置一致,并且均采取查询方式进行下一步操作。
接收数据程序只需执行一次,即驻留在内存中,此后,只要U号计算机有数据要发送,则I号机随时接收并显示在屏幕上。
开始
保护原寄存器内容
保护原寄存器内
*
显示接收信息
显示提示信
读键盘输入
Y
N
读状态寄存器
接收有错?
1
F
输入缓冲器处读数
接收到数
发送并显示
恢复原寄存器内容
返回
图3-21发送程序
容
是
是enter?
显示接收内
—X.
换行
恢复原寄存器内
图3-22接受程序
6.程序代码
源程序:
DISPMACROVAR定义宏,完成字符串的输出
MOVAH,9
MOVDX,OFFSETVAR
INT21H
ENDM
DATASEGMENT
TEXTDB'
THEQUICKBROWNFOXJUMPSOVERLAZYDOG'
0DH,0AHLLLEQU$-TEXT;
电文长度->
LLL
ERRORDB'
COMBAD!
'
0DH,0AH,'
$'
NEQU24DUP('
)
MESG1DB0DH,0AH
DBN,'
MENU'
0DH,0AH
---
'
|
|'
1.COM2INTERNALLOOP|'
2.SHUANGJI|'
3.EXIT|'
||'
CHOICE(1,2,3):
$
MESG2DB0DH,0AH
MENU
-'
|'
1.SENT
2.RECIEVE
CHOICE(1,2):
0DH,0A卜
MESG3DB0DH,0AH,'
PLEASEINPUTTHEMESSEGE:
0DH,0AH,'
MESG4DB0DH,0AH,'
THEMESSAGEYOUINPUTARE:
0DH,0AH,"
$"
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LAST:
DISPMESG1;
显示操作信息,选择是内环自检还是双机通信
MOVAH,01H
INT21H;
等待键入一个字符,有回显,响应Ctrl_C
CMPAL,'
1'
JENEXT1;
如果输入1,转测辅串口内环自检
CMPAL,2
JENEXT2;
如果输入2,转双机通信
CMPAL,3
JNELAST
JMPEXIT;
测试结束,退出
;
PC机辅串口的内环自检
NEXT1:
CALLI8250;
辅串口初始化
AGAIN:
MOVCX,LLL;
电文长度—CX
MOVBX,OFFSETTEXT;
BX指向TEXT的首地址
SCANT:
MOVAH,01H
INT16H;
查询键盘缓冲区
JNZEXIT;
有键入,转退出
MOVDX,2FDH
INAL,DX;
从DX旨向的端口中读一个字节到ALTESTAL,20H;
检查发送保持寄存器是否空闲
JZSCANT;
若不空闲,转SCANT俞入检查MOVDX,2F8H;
发送保持寄存器辅串口地址->
DX
MOVAL,[BX]
OUTDX,AL;
将字符送辅串口数据寄存器
MOVSI,0
SCANR:
INAL,DX;
读取通信线状态字
TESTAL,00011110B;
检查有无错误标志
JNZDISPERR;
有错,显示出错信息
TESTAL,01H;
无错,检查接收数据是否准备好
JNZRECEIVE;
准备好,转接收程序
DECSI
JNZSCANR
JMPDISPERR
RECEIVE:
MOVDX,2F8H;
接收缓冲器辅串口地址->
接收一个数据
MOVAH,2
MOVDL,AL
送屏幕显示一个字符
INCBX
LOOPSCANT;
一个电文长度计数
JMPAGAIN;
重复内环自检
DISPERR:
DISPERROR;
显示出错信息
EXIT:
MOVAH,4CH
返回DOS
18250PROC
MOVXX,00C7H;
波特率4800,无校验传输,2个停止位,一桢字符有
8个数据位,即为11000111B
MOVDX,1;
对辅串口进行初始化
INT14H
MOVDX,2FCH;
MODEjM制寄存器辅串口地址->
MOVAL,00010000B;
D4=1,8250工作在内部自环方式
OUTDX,AL
RET
I8250ENDP
双机通信
NEXT2:
DISPMESG2;
显示操作信息,发送还是接收信息
MOVAH,1
JESENDM;
当输入为1时,转发送信息
2'
JERECEM;
当接受为2时,转接收信息
JMPNEXT2
SENDM:
发送信息
MAIN:
对8250主串口进行初始化。
通信速率选用4800波特,无校验传输,一桢字符有8个数据位,2个停止位
MOVAL,80H
MOVDX,3FBH
80H->
通信线控制寄存器,使寻址位为1
MOVDX,3F9H
MOVAL,0
除数高8位->
除数寄存器高8位
MOVDX,3F8H
MOVAL,18H
除数低8位->
除数寄存器低8位
MOVAL,00000111B;
把命令字写入通信线控制寄存器
查询方式,置中断允许命令字为0
WAIT0:
MOVAH,0BH
查询有无键盘输入,响应CtrlC
CMPAL,0;
AL=0时无输入,AL=0FFH寸有输入
JEWAIT0;
当无输入时,返回等待
MOVAH,0
读取键入的一个字符,无回显,响应Ctrl_C,无键入则等待
PUSHAX
MOVAH,02H
MOVDL,AL
DOS
功能调用,显示一个字符,DL彳寺显示的ASCII码
POPAX
CALLSENTCHAR
JMPWAIT0
;
传输字符
从本机向对方发送字符串,同时在两个屏幕上都显示
按回车键,则双方都换行,按ESC键,双方都退出。
SENTCHARPROC
NEAR
PUSHDS
PUSHBX
PUSHCX
PUSHDX
DISPMESG3
显示提示信息
STATUE:
读取通信线路状态,查询工作
MOVDX,3FDH
读通信线状态字
TESTAL,20H
检测发送保持寄存器是否为空
JNZKBOARD;
已空,转发送程序
KBOARD:
查询有无键盘输入,响应CtrlC
CMPAL,0
JZKBOARD;
无字符输入,循环等待
MOVAH,0;
有字符输入则读取字符
读取键入的一个字符,无回显,响应Ctrl_C
将字符写入到发送保持寄存器
CMPAL,1BH;
ESC的ASCII码为0011011B
JZDONE1;
输入为ESC键,则退出程序返回DOS同时对方也返回DOS
功能调用,显示输一个字符
CMPAL,0DH;
继续检查是否是ENTER®
,ENTER勺ASCII码为0001101B
JNZSTATUE;
如果不是ENTER!
则继续输入下一个字符
MOVDL,0AH;
换行的ASCII码为00001010B
显示换行
JMPSTATUE;
换行后继续输入下一个字符
DONE1:
POPDX;
出栈
POPCX
POPBX
POPDS
SENTCHARENDP
RECEM:
接收信息
START1:
通信速率选用4800波特,无校验传输,一桢字符有8个数据位,2个停
止位
80H
->
除数高8位->
除数低8位->
MOVAL,00000111B
把D7-0的命令字写入通信线控制寄存器,确定一帧数据的
格式
查询方式,置中断允许命令字为0
CALLRECEIVE1
MOVAX,4C00H
返回DOS
RECEIVE1PROCNEAR
DISPMESG4;
屏幕显示信息,接收到得字符串
REC:
读通信线路状态寄存器
TESTAL,1EH;
判断接收是否有错
JNZERROR1
有错,则转出错处理
TESTAL,01H
JNZRECEIVE2
准备好转接收程序
JMPREC;
继续读取下个数
RECEIVE2:
从输入缓冲寄存器读数据
ANDAL,7FH;
传送标准ASCII码
PUSHAX;
保存数据
屏幕显示该数据
POPAX;
恢复数据
判断是否为ESC键
JZDONE2;
如果是则退出DOS
CMPAL,0DH
判断是否为回车符
JNZREC;
如果不是ENTER®
,则继续循环
MOVDL,0AH
输出换行
循环,检测下个数
ERROR1:
读出接收有误的数据,丢掉
MOVDL,'
?
显示问号
继续查询
DONE2:
POPDX
RECEIVE1ENDP
CODEENDS
ENDSTART
7.主要参考文献: