课 程 设 计
课程名称 计算机接口与通信 题目名称 两台计算机之间通信 学生学院 计算机学院 专业班级 07级计算机科学与技术8班 学 号 ********** 学生姓名 杨康强 指导教师 刘敬勇
2011年 1月 7日
一. 课程设计的内容
设计一套系统,要求能在两台计算机之间以中断方式和查询方式实现串行通信,数据可以采用ASCII字符方式和二进制方式传送。
二. 相关技术
(一)串行口的有关硬件资料
1.9芯RS-232C接口标准
引脚1:CD,载体检测; 引脚2:RXD,接收数据; 引脚3:TXD,发送数据; 引脚4:DTR,终端准备好; 引脚5:信号地;
引脚6:DSR,MODEM准备好; 引脚7:RTS,请求发送; 引脚8:CTS;清除发送; 引脚9:RI,响铃指示。
2.9芯RS-232C的零MODEM的连接方法
CD 1 P RXD 2 TXD 3 C DTR 4 信号地 5 机 DSR 6 RTS 7 A CTS 8 RI 9 1 CD 2 RXD P 3 TXD 4 DTR C 5 信号地 6 DSR 机 7 RTS 8 CTS B 9 RI
3.线路控制寄存器(口地址3FBH/2FBH)
D7 D6 D5 D4 D3 D2 D1 D0 字长选择位0
字长选择位1 停止位个数位 奇偶校验允许位 偶校验选择位 跟随校验 断线检测 分频门闩位(DLAB)
其中: D4 D3 奇偶校验 D2 停止位 D1 D0 字长
X 0 无校验 0 1 0 0 5 0 1 奇 1 1.5(字长为5位时) 0 1 6 1 1 偶 1 2(字长6,7,8位时) 1 0 7 1 1 8
4.可编程波特率发生器(3F9H,3F8H或2F9,2F8H)
DLAB=1时,向3F9H/2F9H(高八位),3F8H/2F8H(低八位)写入——-16位数,即可对1.8432MHZ的时钟分频,得到串行口的波特率。公式为:
波特率=1843200/(分频值×16)
输入频率1.8432MHz 波特率 分频器H 分频器L
600 00H C0H 1200 00H 60H 1800 00H 40H 2000 00H 3AH 2400 00H 30H 3600 00H 20H 4800 00H 18H 7200 00H 10H 9600 00H 0CH 19200 00H 06H
5.线路状态寄存器(3FDH/2FDH) D7 D6 D5 D4 D3 D2 D1 D0 接收数据准备好(RDA
超时错 奇偶校验错 贞错 线路中断 发送保持寄存器空(TBE) 发送移位寄存器空 ≡0
6.中断识别寄存器(3FAH/2FAH)
D7 D6 D5 D4 D3 D2 D1 D0 是否有中断
中断识别位0 中断识别位1 =0 =0 =0 =0 =0
其中:D2 D1 D0 中断来源
X X 1 NONE 1 1 1 线路故障
1 0 0 接收数据准备好 0 1 0 发送保持寄存器空 0 0 0 MODEM中断
7.中断允许寄存器(3F9H/2F9H,且DLAB=0) D7 D6 D5 D4 D3 D2 D1 D0 允许接收寄存器好中断
允许发送保持寄存 中断
允许线路故障中断 允许Modem中断 =0 =0 =0 =0 8.MODEM控制寄存器(3FCH/2FCH)
D7
数据终端准备好(DTR)
请求发送(RTS)
OUT1 OUT2 返环 =0 =0 =0
D6 D5 D4 D3 D2 D1 D0 9.MODEM状态寄存器(3FEH/2FEH)
D7 D6 D5 D4 D3 D2 D1 D0 CTS位发生改变
DSR位发生改变 收到震铃指示后沿 线路信号测试 清除发送 数据装置准备好 震铃指示 接收线路载波检测
8250内部寄存器端口地址及读写情况
端口地址 寄存器名称 读/写
3F8H 发送保持寄存器 OUT 3F8H 接收数据寄存器 IN 3F8H 波特率分频器L OUT 3F9H 波特率分频器H OUT 3F9H 中断允许寄存器 OUT 3FAH 中断标识寄存器 IN 3FBH 线路控制寄存器 OUT 3FCH MODEM控制寄存器 OUT 3FDH 线路状态寄存器 IN 3FEH MODEM状态寄存器 IN
(二) VSPM虚拟串口软件介绍
VSPM 虚拟串口软件可以将TCP/IP、UDP广播映射成本机的虚拟COM 口,应用程序通过访问虚拟串口,就可以完成远程控制、数据传输等功能。 通过扩展DLL,可以实现串口互通、协议分析、数据采集等功能,提供例程代码。 此软件可免费用于商业用途,例如串口服务器、无线DTU产品配套等。
用VSPM虚拟串口软件虚拟出dos下的COM1和COM2端口,其实就是将UDP端口映射为COM1和COM2端口。这样就可以通过在局域网内用UDP包通讯来模拟COM1和COM2端口的通讯。
运行环境的模拟:
首先安装VSPM程序,然后运行,选择菜单“设置”“选择工作模式”“UDP广播模式”“使用串口服务器探测器建立串口”来设置VSPM的工作模式。
接着创建虚拟COM1和COM2端口,选择菜单“虚拟串口管理”“新增虚拟串口”来创建虚拟COM1和COM2端口。
三. 方案设计
先构思查询方式的串口通讯程序,然后再在查询方式的基础上修改出中断方式的串口通讯程序。
查询方式的串口通讯发送程序流程图如下:
发送寄存器是否为空 关闭回送和中断允许且使DTR和RTS信号有效 初始化程序所用寄存器 置8250的波特率和数据传输格式 是 否
关闭程序 发送数据
中断方式的串口通讯发送程序流程图如下: 主程序部分:
保存COM1的初始中断向量
关回送,允许中断,是DTR和RTS有效 置8259中断屏蔽寄存器允许IR4中断 置8250的波特率和数据传输格式 置COM1的中断程序的中断向量 关闭回送和中断允许且使DTR和RTS信号有效
退出程序,回到dos 延时 清除允许发送保持寄存器空中断和置8259中断屏蔽寄存器关闭IR4中断 开中断 中断处理部分:
否 是否数据发送完 是
退出程序,返回dos 置普通中断结束 清除允许发送保持寄存器空中断 输出一个数据 中断方式的接收程序和查询方式的接收程序相同,程序序流程图如下:
接收寄存器是否就绪 关闭回送和中断允许且使DTR和RTS信号有效 初始化程序所用寄存器 置8250的波特率和数据传输格式 是 否
接收数据并显示 四. 实现与测试
(一)查询方式 发送方代码: datas segment
datapar label byte
maxnlen db 20 actnlen db ?
datasend db 20 dup(?) crlf db 13,10,'$' mess db '
**************************************',13,10,'$'
mess1 db ' * jiekouyutongxinkechengsheji
*',13,10,'$'
mess2 db ' * 07 jisuanjikexueyujishu 8 ban
*',13,10,'$'
mess3 db ' * num:3107006702
name:yangkangqiang *',13,10,'$'
mess4 db '
--------------------------------------',13,10,'$'
mess5 db ' Please input the data you want to
send:','$'
datas ends
stacks segment stacks ends
codes segment main proc far
assume cs:codes,ds:datas,ss:stacks
push ds sub ax,ax push ax mov ax,datas mov ds,ax mov es,ax program:
mov dx,2fbh mov al,80h out dx,al mov dx,2f8h mov al,18h out dx,al inc dx mov al,0
out dx,al;除数为0060H,表示波特率为4800b/s mov dx,2fbh mov al,0eh out dx,al
inc dx
mov al,03h;如果设置为13h则回送,不发送 out dx,al
mov dx,2f9h;中断允许端口 mov al,0 out dx,al
inputloop:
mov ah,09h
lea dx,mess;显示mess int 21h
mov ah,09h
lea dx,mess1;显示mess1 int 21h
mov ah,09h
lea dx,mess2;显示mess2 int 21h
mov ah,09h
lea dx,mess3;显示mess3 int 21h
mov ah,09h
lea dx,mess;显示mess int 21h
mov ah,09h
lea dx,mess4;显示mess4 int 21h
mov ah,09h
lea dx,mess5;显示mess5
int 21h
call input_data
waittosend:
ret main endp
input_data proc near
mov bh,0 mov bl,actnlen mov al,datasend[si] mov dx,2f8h out dx,al inc si cmp si,bx jb waittosend mov dx,2f8h mov al,0ah out dx,al jmp inputloop
mov dx,2fdh in al,dx test al,20H jz waittosend xor si,si
mov ah,0ah ;输入你要发送的数据 lea dx,datapar int 21h
mov ah,02h ;换行 mov dl,0ah int 21h ret
input_data endp
mov ah,4ch
int 21h
codes ends
end main 接收方代码: data segment
mess db ' * num:3107006702 name:yangkangqiang
*',13,10,'$'
mess1 db '
--------------------------------------',13,10,'$'
mess2 db ' The data you receive is:','$' nextline db 13,10,'$'
data ends code segment
assume cs:code,ds:data,es:data main proc far start:
push ds xor ax,ax push ax mov ax,data mov ds,ax mov es,ax xor si,si xor di,di
call infoDisplay
program:
mov dx,3fbh mov al,80h out dx,al mov dx,3f8h mov al,18h out dx,al inc dx mov al,0
out dx,al;除数为0060H,表示波特率为1200b/s mov dx,3fbh mov al,0eh out dx,al inc dx mov al,03h out dx,al
mov dx,3f9h;中断允许端口 mov al,0 out dx,al
xor si,si
lea dx,mess2 mov ah,09h int 21h
waittoreceive:
sign: jmp waittoreceive
lea dx,mess2 ;接受下一个数据的提示 mov ah,09h int 21h cmp dl,0ah jnz sign
lea dx,nextline ;换行 mov ah,09h int 21h mov dx,3f8h
in al,dx ;读取接受到的数据 mov dl,al mov ah,2 int 21h mov dx,3fdh in al,dx
test al,1H ;查询接受端口是否准备就绪 jz waittoreceive
infoDisplay proc near
lea dx,mess1;显示mess1 mov ah,09h int 21h
lea dx,nextline mov ah,09h int 21h ret
lea dx,mess;显示mess mov ah,09h int 21h
infoDisplay endp
ret
code ends end start (一)中断方式 发送方代码: data segment
old dw 2 dup(?) datapar label byte maxnlen db 20 actnlen db ?
datasend db 20 dup(?) newline db 13,10,'$' mess db '
**************************************',13,10,'$'
mess1 db ' * jiekouyutongxinkechengsheji
*',13,10,'$'
mess2 db ' * 07 jisuanjikexueyujishu 8 ban
*',13,10,'$'
mess3 db ' * num:3107006702
name:yangkangqiang *',13,10,'$'
mess4 db '
--------------------------------------',13,10,'$'
mess5 db ' Please input the data you want to
send:','$' data ends code segment main proc far
assume cs:code,ds:data start:
mov ax,data mov ds,ax push ds
mov ax,350ch int 21h mov old,bx mov old+2,es mov ax,0 mov ds,ax
mov dx,offset interrupt_vector mov ds:[30H],dx
mov dx,seg interrupt_vector mov ds:[32H],dx
pop ds
inputloop:
sti
mov bx,0ffffH loop2:mov di,0ffffH loop1:dec di jnz loop1 dec bx jnz loop2 mov dx,3f9h mov al,0 out dx,al ;中断向量写完 cli xor si,si in al,21h and al,11101111b out 21h,al
mov dx,3fch ;modem控制寄存器 mov al, 0bh out dx,al
mov dx,3f9h ;8250中断允许寄存器
mov al,2 ;允许‘发送保持寄存器’空中断 out dx,al call input_data call initial
in al,21h or al,00010000B out 21h,al mov dx,old mov ds,old+1 mov ax,250ch int 21h jmp start mov ah,4ch int 21h
main endp
input_data proc near mov ah,09h
lea dx,mess;显示mess int 21h
mov ah,09h
lea dx,mess1;显示mess1 int 21h
mov ah,09h
lea dx,mess2;显示mess2 int 21h
mov ah,09h
lea dx,mess3;显示mess3
int 21h
mov ah,09h
lea dx,mess;显示mess int 21h
mov ah,09h
lea dx,mess4;显示mess4 int 21h
mov ah,0ah ;输入你要发送的数据 lea dx,datapar int 21h
mov ah,02h ;换行 mov dl,0ah int 21h
mov bh,0 mov bl,maxnlen mov cx,bx
mov bh,0
mov bl,actnlen mov lea int
ah,09h dx,mess5 21h
sub cx,bx ;addtofull:
mov datasend[bx],0ah ;inc bx ;loop addtofull
;lea dx,datasend
;mov ah,09h ;int 21h
ret
input_data endp
initial proc near
mov al,80h ;初始化 mov dx,3fbh out dx,al mov al,18h
mov dx,3f8h ;设置除数锁存器高八位 out dx,al mov al,0 inc dx
out dx,al ;设置除数锁存器低八位 mov dx,3fbh ;数据格式 mov al,0eh out dx,al ret
initial endp
interrupt_vector :
mov al,datasend[si]
display:
mov dx,03f8h out dx,al inc si mov bh,0 mov bl,actnlen inc bx cmp si,bx jae display2 jmp opo
display2:
mov dx,3f9h mov al,0 out dx,al
OPO:
code ends end start 接收方代码: data segment
mess db ' * num:3107006702 name:yangkangqiang mov al,20h out 20h,al iret
*',13,10,'$'
mess1 db '
--------------------------------------',13,10,'$'
mess2 db ' The data you receive is:','$' nextline db 13,10,'$'
data ends
code segment
assume cs:code,ds:data,es:data main proc far start: push ds xor ax,ax push ax mov ax,data mov ds,ax mov es,ax xor si,si xor di,di check_1:
mov dx,2fbh mov al,80h out dx,al
lea dx,mess1;显示mess1 mov ah,09h int 21h
lea dx,mess2 mov ah,09h int 21h
lea dx,mess;显示mess mov ah,09h int 21h
mov dx,2f8h mov al,18h out dx,al inc dx mov al,0
out dx,al;除数为0018H,表示波特率为4800b/s mov dx,2fbh mov al,0fh out dx,al inc dx
mov al,0bh out dx,al
mov dx,2f9h;中断允许端口 mov al,0 out dx,al xor si,si display:
mov dx,2fdh in al,dx test al,1H jz display mov dx,2f8h in al,dx mov dl,al cmp dl,0ah jnz display2
lea dx,nextline ;换行 mov ah,09h
int 21h
lea dx,mess2 mov ah,09h int 21h jmp display
display2:
mov ah,2 int 21h jmp display ret
code ends end start 测试:
首先,运行VSPM虚拟串口,创建虚拟COM1和COM2端口,分别如下图1和图2:
COM1 图1
COM2 图2
其中,UDP接收地址默认为本机的地址,192.168.1.103,UDP发送地址为255.255.255.255,如果COM1的接收端口为7102,发送端口为7101,那么COM2的接收端口相应改为7101,发送端口为7102,确定后,即可建立虚拟连接。如图3:
图3
发送方:(如图4,分别输入jiekouyutongxin,3107006702和yangkangqiang)
图4
接收方:(如图5,接收到来自发送方的字符串,分别是jiekouyutongxin,3107006702和yangkangqiang)
图5
五.分析与总结
课程设计中涉及到了接口与通信课程的很多内容,波特率,各个芯片控制字的设置,虽然这个设计是在考完试后才做的,但是在考完后我并没有将这个课完全丢开,而是再复习了相关的内容,并且去图书馆找到相关的资料来做的。从中也学到了不少东西,对计算机间的通信有了一定了解,也对那些硬件有了一定 认识。
通过这次“双机串行通讯”的课程设计让我了解到了有关于计算机的下面几个内容: RS-232C的实现以及编程原理;了解到接口在计算机输入、输出以及通讯方面所占有地位,对串口有了更进一步的认识,认识到串口功能的强大。
这是一个让我对串口知识在编程上的应用的启蒙,也是对书本知识的加深。对于COM控件的使用是本次的重点,自己在以往的编程中,基本上没用到过这个控件,通过这次的设计,使我对接口知识有了加深,而且对我的编程知识也得到了提高。
这次的课程设计,让我对计算机的基本原理了解得更多,更清晰。我很高兴能够完成这次课程设计,在这过程中,我遇到了一些技术上的问题是我自己无法解决的,通过查找资料,同时通过与同学的合作探讨,对汇编语言应用于接口通信编程和接口与通信这门课程有了更加深刻的了解。
参考书目:(五号,宋体加粗) [1] [2] [3] [4] [5] [6]
余永权,汤荣江 《计算机接口与通信》,华南理工大学出版社,2005年; 洪志全,洪学海主编 《现代计算机接口技术》,电子工业出版社,2002年; 邓亚平,陈昌志编 《微型计算机接口技术》,清华大学出版社,2005年; 葛纫秋 《实用微机接口技术》,高等教育出版社,2003年; 区明明、陈恩孝、王丽仪 《计算机接口与通讯实验指导书》; 网络上一些电子书籍、资料等。
因篇幅问题不能全部显示,请点此查看更多更全内容