接口与通信课程设计.docx
《接口与通信课程设计.docx》由会员分享,可在线阅读,更多相关《接口与通信课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
接口与通信课程设计
课程设计
课程名称_接口与通信___________
题目名称__双击串行通信_______
学生学院__计算机学院__________
专业班级__计算机科学与技术2班
学号____________
学生姓名________________
指导教师________________
200年月日
一.课程设计的内容
编写程序,实现双机串行通信,能正确进行文件或字符的发送和接收。
二.相关技术
1、8250串行通信初始化及收发数据
2、汇编语言
3、虚拟串口软件及串口测试软件的使用
4、masm和link编译器的使用
三.方案设计
根据8250串行口的发送接收原理,在程序开始时一定要先对8250进行初始化,设置相应的参数,使8250串行口工作在合理的工作状态。
进行相关协议的设置——即什么时候发送,什么时候接收,接收跟发送通过什么来进行响应,保证数据传送的正确性。
我设计的程序所采用的是查询机制,虽然效率不及中断机制高,但是简单易行。
在代码阶段,虽然汇编的可读性和结构性都不是很好,但是我还是希望我的代码能做到清晰易读,所以我采取了两种方案
a)如果需要传递参数,则使用宏使代码结构化
b)如果不需要参数,则使用子程序,使代码结构化的同时,调试简单
程序设计如以下流程图
1、程序总流程图
2、发送输入字符流程图
3、发送一个字符流程图
4、接收字符流程图
5、接收一个字符流程图
四.实现与测试
1、实现的源码:
ESCAPEEQU1BH
;定义堆栈
STACKSGSEGMENTSTACK'S'
DW64DUP(?
)
STACKSGENDS
DATASEGMENT
CHOICEDB?
ParmDB?
'$'
COMDW?
TEMPDW?
COM1DW3f0H
COM2DW2f0H
COM3DW3e0H
COM4DW2e0H
TOPDB0DH,0AH,'------------------------------------------------------------'
DB0DH,0AH,'ComputerSerialCommunication------Colin'
DB0DH,0AH,'-----------------------------------------------------------'
OPTMENUDB0DH,0AH,'1.SendMessage'
DB0DH,0AH,'2.ReciveMessage'
DB0DH,0AH,'3.EXIT'
SELECT_STRDB0DH,0AH,'Pleaseinputyourchoice:
',0DH,0AH,'$'
SEND_TIPDB0DH,0AH,'Pleaseinputyourmessage(esctoexit):
',0DH,0AH,'$'
REV_TIPDB0DH,0AH,'Yourrevmessage:
',0DH,0AH,'$'
MAINMENUDB0DH,0AH,'SelectCOM:
'
DB0DH,0AH,'1.COM1'
DB0DH,0AH,'2.COM2'
DB0DH,0AH,'3.COM3'
DB0DH,0AH,'4.COM4'
DB0DH,0AH,'5.EXIT'
DB0DH,0AH,'Pleaseinputyourchoice:
$'
DATAENDS
;定义宏
;设置显示颜色(4字节有效)
SETCLRMACROCOLOR
PUSHCX
PUSHBX
PUSHAX
MOVAH,9
MOVAL,''
MOVBH,0
MOVBL,COLOR
MOVCX,4
INT10H
POPAX
POPBX
POPCX
ENDM
;回显一个字符
PUTSMACROS
PUSHDX
PUSHAX
MOVAH,9
LEADX,S
INT21H
POPAX
POPDX
ENDM
;输出字符串
OUTPUTMACROS
PUSHDX
PUSHAX
MOVAH,9
LEADX,S
INT21H
POPAX
POPDX
ENDM
;将最高位清零
LCRDLMACRO
PUSHDX
MOVAL,1FH
MOVDX,COM
MOVTEMP,DX
ADDTEMP,0BH
MOVDX,TEMP
OUTDX,AL
POPDX
ENDM
;选择
INPUT_SELECTMACRO
PUSHAX
PUSHDX
MOVAH,0CH
MOVAL,06H
MOVDL,0FFH
INT21H
MOVAH,01H
INT21H
MOVParm,AL
POPDX
POPAX
ENDM
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
MOVCOM,AX
JMPINITC
SELECTCOM3:
MOVAX,COM3
MOVCOM,AX
JMPINITC
SELECTCOM4:
MOVAX,COM4
MOVCOM,AX
JMPINITC
INITC:
CALLINIT_COM
PROSTART:
OUTPUTTOP
INPUT_SELECT
MOVAL,[Parm]
CMPAL,32H
JLCALL_SEND
JECALL_REV
JGPROOVER
CALL_SEND:
CALLNEARPTRSEND_MEG
JMPPROSTART
CALL_REV:
CALLNEARPTRREV_MEG
JMPPROSTART
PROOVER:
MOVAX,4C00H
INT21H
MAINENDP
;初始化端口
INIT_COMPROCNEAR
PUSHAX
PUSHDX
MOVAL,80H
MOVDX,COM
MOVTEMP,DX
ADDTEMP,0BH
MOVDX,TEMP
OUTDX,AL
MOVAL,0CH
MOVDX,COM
MOVTEMP,DX
ADDTEMP,08H
MOVDX,TEMP
OUTDX,AL
MOVAL,0
MOVDX,COM
MOVTEMP,DX
ADDTEMP,09H
MOVDX,TEMP
OUTDX,AL
MOVAL,00001110B;7bitfordata2bitforstop,havatest
MOVDX,COM
MOVTEMP,DX
ADDTEMP,0BH
MOVDX,TEMP
OUTDX,AL
MOVAL,0FH
MOVDX,COM
MOVTEMP,DX
ADDTEMP,09H
MOVDX,TEMP
OUTDX,AL
MOVAL,0BH
MOVDX,COM
MOVTEMP,DX
ADDTEMP,0CH
MOVDX,TEMP
OUTDX,AL
POPDX
POPAX
RET
INIT_COMENDP
;发送一个字符
SENDCHPROCNEAR
SETCLR0CH
MOVParm,AL
;PUTSParm;显示[字符]
LCRDL
MOVDX,COM
MOVTEMP,DX
ADDTEMP,0DH
MOVDX,TEMP;状态口
SEND:
INAL,DX;读状态
TESTAL,20H;发送就绪?
JZSEND
MOVDX,COM
MOVTEMP,DX
ADDTEMP,08H
MOVDX,TEMP;数据口
MOVAL,[Parm]
OUTDX,AL
RET
SENDCHENDP
;从串口接收一个字符
RECVCHPROCNEAR
LCRDL
MOVDX,COM
MOVTEMP,DX
ADDTEMP,0DH
MOVDX,TEMP;状态口
INAL,DX;读状态
TESTAL,01H;收到数据?
JZNORECV
MOVDX,COM
MOVTEMP,DX
ADDTEMP,08H
MOVDX,TEMP;数据口
INAL,DX
SETCLR0AH
MOVParm,AL;显示<字符>
PUTSParm
NORECV:
RET;NOP
RECVCHENDP
;发送信息
SEND_MEGPROCNEAR
PUSHAX
PUSHDX
OUTPUTSEND_TIP
JMPGETKEY
KEYRD:
MOVAH,0CH;清除键盘缓冲区
MOVAL,06H
MOVDL,0FFH
INT21H
GETKEY:
MOVAH,1;读取键盘输入
INT21H
CMPAL,ESCAPE;ESC键结束发送
JEOVERSEND
CMPAL,32;排除不可见字符
JLKEYRD
CMPAL,126
JGKEYRD
CALLSENDCH
JMPKEYRD
OVERSEND:
CALLSENDCH
POPDX
POPAX
RET
SEND_MEGENDP
;接收信息
REV_MEGPROCNEAR
PUSHAX
PUSHDX
OUTPUTREV_TIP
REV:
CALLRECVCH
CMPAL,ESCAPE
JEOVERREV
JMPREV
OVERREV:
POPDX
POPAX
RET
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]王爽《王爽的汇编》