接口与通信课程设计.docx

上传人:b****5 文档编号:6211290 上传时间:2023-01-04 格式:DOCX 页数:16 大小:937.70KB
下载 相关 举报
接口与通信课程设计.docx_第1页
第1页 / 共16页
接口与通信课程设计.docx_第2页
第2页 / 共16页
接口与通信课程设计.docx_第3页
第3页 / 共16页
接口与通信课程设计.docx_第4页
第4页 / 共16页
接口与通信课程设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

接口与通信课程设计.docx

《接口与通信课程设计.docx》由会员分享,可在线阅读,更多相关《接口与通信课程设计.docx(16页珍藏版)》请在冰豆网上搜索。

接口与通信课程设计.docx

接口与通信课程设计

课程设计

课程名称_接口与通信___________

题目名称__双击串行通信_______

学生学院__计算机学院__________

专业班级__计算机科学与技术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]王爽《王爽的汇编》

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1