接口与通信课程设计Word文档格式.docx
《接口与通信课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《接口与通信课程设计Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
![接口与通信课程设计Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/4/178d75b9-a76a-44e6-a530-1579b74cd8e1/178d75b9-a76a-44e6-a530-1579b74cd8e11.gif)
5、接收一个字符流程图
四.实现与测试
1、实现的源码:
ESCAPEEQU1BH
;
定义堆栈
STACKSGSEGMENTSTACK'
S'
DW64DUP(?
)
STACKSGENDS
DATASEGMENT
CHOICEDB?
ParmDB?
'
$'
COMDW?
TEMPDW?
COM1DW3f0H
COM2DW2f0H
COM3DW3e0H
COM4DW2e0H
TOPDB0DH,0AH,'
------------------------------------------------------------'
DB0DH,0AH,'
ComputerSerialCommunication------Colin'
-----------------------------------------------------------'
OPTMENUDB0DH,0AH,'
1.SendMessage'
2.ReciveMessage'
3.EXIT'
SELECT_STRDB0DH,0AH,'
Pleaseinputyourchoice:
'
0DH,0AH,'
SEND_TIPDB0DH,0AH,'
Pleaseinputyourmessage(esctoexit):
REV_TIPDB0DH,0AH,'
Yourrevmessage:
MAINMENUDB0DH,0AH,'
SelectCOM:
'
1.COM1'
2.COM2'
3.COM3'
4.COM4'
5.EXIT'
DATAENDS
;
定义宏
设置显示颜色(4字节有效)
SETCLRMACROCOLOR
PUSHCX
PUSHBX
PUSHAX
MOVAH,9
MOVAL,'
MOVBH,0
MOVBL,COLOR
MOVCX,4
INT10H
POPAX
POPBX
POPCX
ENDM
;
回显一个字符
PUTSMACROS
PUSHDX
LEADX,S
INT21H
POPDX
输出字符串
OUTPUTMACROS
PUSHDX
PUSHAX
MOVAH,9
LEADX,S
INT21H
POPAX
POPDX
ENDM
将最高位清零
LCRDLMACRO
MOVAL,1FH
MOVDX,COM
MOVTEMP,DX
ADDTEMP,0BH
MOVDX,TEMP
OUTDX,AL
选择
INPUT_SELECTMACRO
MOVAH,0CH
MOVAL,06H
MOVDL,0FFH
MOVAH,01H
MOVParm,AL
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
OUTPUTMAINMENU
INPUT_SELECT
MOVAL,[Parm]
CMPAL,32H
JLSELECTCOM1
JESELECTCOM2
CMPAL,34H
JLSELECTCOM3
JESELECTCOM4
JGPROOVER
SELECTCOM1:
MOVAX,COM1
MOVCOM,AX
JMPINITC
SELECTCOM2:
MOVAX,COM2
SELECTCOM3:
MOVAX,COM3
SELECTCOM4:
MOVAX,COM4
INITC:
CALLINIT_COM
PROSTART:
OUTPUTTOP
CMPAL,32H
JLCALL_SEND
JECALL_REV
JGPROOVER
CALL_SEND:
CALLNEARPTRSEND_MEG
JMPPROSTART
CALL_REV:
CALLNEARPTRREV_MEG
JMPPROSTART
PROOVER:
MOVAX,4C00H
MAINENDP
初始化端口
INIT_COMPROCNEAR
MOVAL,80H
MOVDX,COM
MOVTEMP,DX
ADDTEMP,0BH
MOVDX,TEMP
OUTDX,AL
MOVAL,0CH
ADDTEMP,08H
MOVAL,0
ADDTEMP,09H
MOVAL,00001110B;
7bitfordata2bitforstop,havatest
MOVAL,0FH
MOVAL,0BH
ADDTEMP,0CH
RET
INIT_COMENDP
发送一个字符
SENDCHPROCNEAR
SETCLR0CH
MOVParm,AL
PUTSParm;
显示[字符]
LCRDL
ADDTEMP,0DH
MOVDX,TEMP;
状态口
SEND:
INAL,DX;
读状态
TESTAL,20H;
发送就绪?
JZSEND
ADDTEMP,08H
数据口
MOVAL,[Parm]
RET
SENDCHENDP
从串口接收一个字符
RECVCHPROCNEAR
TESTAL,01H;
收到数据?
JZNORECV
INAL,DX
SETCLR0AH
MOVParm,AL;
显示<
字符>
PUTSParm
NORECV:
RET;
NOP
RECVCHENDP
发送信息
SEND_MEGPROCNEAR
OUTPUTSEND_TIP
JMPGETKEY
KEYRD:
MOVAH,0CH;
清除键盘缓冲区
MOVAL,06H
MOVDL,0FFH
GETKEY:
MOVAH,1;
读取键盘输入
CMPAL,ESCAPE;
ESC键结束发送
JEOVERSEND
CMPAL,32;
排除不可见字符
JLKEYRD
CMPAL,126
JGKEYRD
CALLSENDCH
JMPKEYRD
OVERSEND:
CALLSENDCH
RET
SEND_MEGENDP
接收信息
REV_MEGPROCNEAR
OUTPUTREV_TIP
REV:
CALLRECVCH
CMPAL,ESCAPE
JEOVERREV
JMPREV
OVERREV:
REV_MEGENDP
CODEENDS
ENDSTART
2、测试:
a)创建虚拟端口
b)选择端口
c)选择操作
d)发送接收数据
e)发送结束
f)退出
选择3,正常退出
五.分析与总结
本次设计为用汇编编写程序,实现双机串行通信,能正确进行文件或字符的发送和接收。
万事开头难,在设计开始时,完全不知道如果下手。
只能硬着头皮做下去,其中遇到的问题以及解决方法如下:
1、第一步当然是先做界面。
但是因为当时汇编没学好,连编译器怎么用都忘了。
无奈之下,去XX文库下了一份msam5.0的教程,重新学习了msam的编译、执行、调试。
而在编写界面代码之时,才真正受了汇编没学好的苦。
拿着汇编的课本,不断地查指令和DOS系统功能调用表,程序不断出现错误,比如忘了在字符串结束处加入’$’。
经过一个晚上的奋斗,终于初步解决了汇编语言问题。
不得不佩服韩顺平老师的一句话:
“计算机是在做中学的学科”。
2、第二步是把所写的界面代码结构化。
这是在看《王爽的汇编》这本书中得到的启示。
不过在结构化方面,我不知道应该选择宏还是选择子程序。
虽然我倾向于子程序,不过宏在参数传递部分很像C语言,所以我一开始还是选择了宏。
这是我噩梦的开始,因为在调试的时候,编译器无法确定具体的错误位置,使得调试非常麻烦。
不得已,我将一大部分较为复杂的宏改为子程序。
3、第三步是发送数据。
发送数据之前当然是要对串口进行初始化。
这一部分我借鉴了书中的程序,还算成功。
可是在发送数据的时候我蒙了,完全不知道怎么做,把接口与通信的课本中提到8250的知识再看了一遍,发现以前懵懂的地方都清晰了好多,再把一些疑问往XX一贴,大概明白了设计的思路。
就是在一对互连的的端口中,一端发送一端接收,主要用in和out指令,输入输出的地址都是规定好的。
在一开始可以用虚拟串口软件虚拟两个互连的端口。
本着这种思路,我开始画程序流程图,并且将代码结构写出。
4、第四步是测试发送数据是否成功。
因为没有写接收的代码,所以测试方面,我用了一个串口测试软件,将其波特率,数据位,停止位,校验位等设置好,测试是否能接收到。
当然错误是避免不了的,一开始发送时,系统总是出现错误提示,而程序就直接挂了。
怀疑是串口问题,在用其它串口的时候发现每次都要修改代码重新编译,非常麻烦。
所以在程序入口处,加入了串口选择功能。
最后在单步执行的时候发现,是高位清零的宏中,串口地址赋值错误。
改正后,终于发送成功了。
5、第五步是接收数据。
有了前面的经验,这时显得比较轻松,出现的一些代码问题都能解决。
每次的课程设计都是对自己能力的升华。
这次课程设计,然后有了挑战苦难的信心,本来一头雾水的设计,通过一步步做下来,竟然解决了,当时的成就感不言而喻。
而在对于端口的理解和汇编语言的掌握程度,毫无疑问地前进了一大步!
附参考书目
[1]余永权,汤荣江《计算机接口与通信》
[2]王爽《王爽的汇编》