数据通信与控制网络实验指导书Word格式文档下载.docx

上传人:b****3 文档编号:15700450 上传时间:2022-11-15 格式:DOCX 页数:52 大小:714.04KB
下载 相关 举报
数据通信与控制网络实验指导书Word格式文档下载.docx_第1页
第1页 / 共52页
数据通信与控制网络实验指导书Word格式文档下载.docx_第2页
第2页 / 共52页
数据通信与控制网络实验指导书Word格式文档下载.docx_第3页
第3页 / 共52页
数据通信与控制网络实验指导书Word格式文档下载.docx_第4页
第4页 / 共52页
数据通信与控制网络实验指导书Word格式文档下载.docx_第5页
第5页 / 共52页
点击查看更多>>
下载资源
资源描述

数据通信与控制网络实验指导书Word格式文档下载.docx

《数据通信与控制网络实验指导书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据通信与控制网络实验指导书Word格式文档下载.docx(52页珍藏版)》请在冰豆网上搜索。

数据通信与控制网络实验指导书Word格式文档下载.docx

通过ADAM模块进行多台(3~4台)PC机的连接,实现一主多从通信。

3.CAN总线多主通信方式:

通过PC机ISA插槽的CAN通信适配卡进行多台PC机连接,实现多主通信。

 

实验一RS-232点对点通信方式

(一)PC及其兼容工控机的异步通讯接口

PC及其兼容工控机都有两个异步通讯接口:

COM1和COM2,其关键部件是通用异步收发器(UART)INS8250。

INS8250的内部有10个寄存器,分别用于通讯参数的设置、线路及MODEM的控制与状态查询、数据收发及中断管理等。

要在中断方式下收发数据,必须对INS8250的寄存器直接操作,各寄存器名称及其相应的端口地址列于表1。

由表1可知:

THR、RBR和DLL占用同一个端口地址3F8H(2F8H),IER和DLM也占用同一个端口地址3F9H(2F9H),对它们进行访问时,如果设置LCR的最高位为1,访问的是除数寄存器;

如果设置LCR的最高位为0,则访问的是THR、RBR和IER。

而THR是只写寄存器,RBR是只读寄存器,在LCR的最高位设置为0时,对端口地址3F8H(2F8H)的写入操作访问的是THR,读出操作访问的是RBR。

硬件连接方式:

将2台PC机的COM1/COM2串行通信口通过9针D型接口3线连接。

(二)INS8250有关寄存器的设置

串行口的初始化主要是对INS8250的有关寄存器进行设置,以确定通讯的数据格式、波特率、中断的触发方式等。

①确定数据格式数据格式是通过设置线路控制寄存器(LCR)来确定的,LCR的定义如下:

其中:

WSL1、WSL0用于选择每个发送或接收的串行字符的位数,分别设置这两位为00、01、10、11时,对应的字长依次是5位、6位、7位、8位;

STB用于确定停止位的位数,STB=0时使用1位停止位,STB=1时,如果WSL1、WSL0设置为00,使用1.5位停止位,其它情况下使用2位停止位;

PEN用于选择是否允许奇偶校验,PEN=0时,不进行奇偶校验,PEN=1时有奇偶校验;

此时,EPS选择校验方式,EPS=0时是奇校验,EPS=1时是偶校验;

SP用于选择是否在奇偶校验位和停止位之间插入奇偶标志位,SP=0时不插入,SP=1时插入1位奇偶标志位,偶校验时插一个0,奇校验时插入一个1;

SB是设置间断控制位,SB=1时输出数据强迫为0,SB=0时可进行正常的数据收发;

DLAB是除数寄存器访问位,DLAB=1时访问除数寄存器,DLAB=0时访问THR、RBR和IER。

②设置波特率INS8250内部包含一个可编程的波特率发生器,它允许用1~65535的任意除数对1.8432MHz的输入频率进行分频,分频后的信号即波特率发生器的输出频率,而波特率是波特率发生器输出频率的1/16。

由此可知,除数=1843200/(波特率×

16)。

16位的除数应在初始化时写入除数锁存器。

③中断机制的引发INS8250可由4个事件中的任一个来引发一个中断,这4个事件依此是:

接收数据有效;

发送保持寄存器空;

接收数据出错;

MO-DEM状态改变。

通过IER的bit0~bit3可依次设置它们是否被允许,某位为1时相应的事件允许引发一个中断,为0时禁止。

INS8250通过INTRPT引脚的高电平向系统发出中断请求,为了使INS8250能够向系统发中断,MCR的第三位必须置1。

PC使用8259中断控制器,它可以管理来自外设的8个各自独立的中断请求信号IRQ0~IRQ7,其中IRQ4和IRQ3分别用于COM1和COM2的中断申请。

8259内部有一个中断屏蔽寄存器(IMR),端口地址为21H,它的bit0~bit7分别对应IRQ0~IRQ7,通过设置其中的某一位为0以允许与其对应的中断请求。

(三)程序设计要点

在程序设计时,应该考虑以下问题:

①设置中断向量,以保证CPU执行中断服务程序时有一个正确的入口地址。

可使用C语言的库函数setvect()和getvect()对中断向量进行设置和读取。

②中断服务程序什么时候结束,CPU无法知道,8259中断控制器也无法知道,必须通过指令通知8259中断控制器。

对于PC机,这条指令就是向端口地址20H写入一个命令字20H。

③为保证通讯的可靠性以及不耽误CPU响应其它中断,中断服务程序应尽量短,一些费时的操作如数据存盘等应放在中断服务程序以外。

④在把一个数据写入发送保持寄存器(THR)之前,必须检查线路状态寄存器LSR,以保证发送保持寄存器为空。

⑤初始化中断系统时,应该关闭中断,初始化完成后再开放。

可使用C语言的库函数disable()和enable()来完成。

(四)推荐程序调试方式:

①在1台PC机上安装具有如下界面的软件工具——“串口调试助手”(图1),在另一台PC机上分别调试发送和接收程序;

图1

②在2台PC机上联合调试完整的发送/接收程序。

(五)推荐基础程序1——TurboC语言程序

1.程序说明:

本程序是通过硬件中断方式完成RS-232接收与发送串行通信的。

使用COM1进行通信时,产生的硬件中断号为IQR4,对应的中断向量为0CH。

数据的接收采用环形列队的方法,由函数inportb()来完成。

该程序运行后,用户可由其他设备向本机的COM1串行口发送数据,你可以看到在屏幕的一个窗口中显示到接收的字符串;

数据发送程序参数的设置由函数port_init()来完成,数据发送由函数outportb()来完成。

参考书:

徐金梧,杨德斌,徐科.TurboC实用大全。

机械工业出版社.1996年.563-566

尹彦芝.C语言常用算法与子程序.清华大学出版社.1993年.239-241

袁征,杨仁树,严建新.C语言编程技巧程序集.电子工业出版社.1993年.233-234

2.接收数据子程序如下:

/*通过中断方式由RS-232接收数据*/

#include<

stdlib.h>

dos.h>

process.h>

conio.h>

bios.h>

ctype.h>

stdio.h>

fcntl.h>

#defineBUFFLEN10800

#defineBUFFMAX900

voidInit(void);

voidcheck(unsignedcharstates);

voidenableports(void);

voiddisableports(void);

voidinterruptfarasyncint(void);

voidinterrupt(*asyncvect)(void);

voidputb(unsignedcharch);

unsignedcharinchar,flag=0;

unsignedcharBuffer[BUFFLEN];

intbuffin=0;

intbuffout=0;

inti=0,ii=0;

unsignedchartemp_buffer[BUFFMAX];

unsignedcharch,flag;

/*开放串行口中断*/

voidenableports(void)

{

unsignedcharB;

asyncvect=getvect(0x0c);

disable();

inportb(0x3f8);

inportb(0x3fe);

inportb(0x3fb);

inportb(0x3fa);

outportb(0x3fc,0x08|0x0b);

outportb(0x3f9,0x01);

B=inportb(0x21)&

0xef;

outportb(0x21,B);

setvect(0x0c,asyncint);

enable();

}

/*中断服务程序*/

voidinterruptfarasyncint(void)

unsignedcharch;

ch=inportb(0x3f8);

flag=1;

putb(ch);

outportb(0x20,0x20);

/*关闭串行口中断*/

voiddisableports(void)

outportb(0x3f9,0x00);

outportb(0x3fc,0x00);

outportb(0x21,inportb(0x21)&

0x10);

setvect(0x0c,asyncvect);

/*对COM1串行口有关参数的初始化*/

voidInit()

outportb(0x3fb,0x80);

outportb(0x3f8,0x0c);

outportb(0x3fb,0x1f);

voidcheck(unsignedcharstates)

while((inportb(0x3fd)&

states)==0);

voidputb(unsignedcharch)

inttemp=0;

if(++ii>

BUFFMAX)ii=0;

temp=buffin;

if(++buffin==BUFFLEN)buffin=0;

if(buffin!

=buffout)

Buffer[buffin]=ch;

else

buffin=temp;

temp_buffer[ii]=ch;

/*从数据端口3F8H中读取相应的数据*/

unsignedchargetb(void)

if(buffout!

=buffin)

if(++buffout==BUFFLEN)buffout=0;

return(Buffer[buffout]);

elsereturn(0xff);

main()

clrscr();

/*绘制数据接收窗口*/

window(3,2,41,10);

textcolor(0);

textbackground(3);

gotoxy(3,2);

cprintf("

ReceivefromCOM1:

\n"

);

gotoxy(3,4);

9600bps,8bit,2stop,even\n"

gotoxy(3,6);

textcolor(223);

Pressanykeycountiune!

\n"

getch();

window(45,2,79,22);

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

当前位置:首页 > 教学研究 > 教学反思汇报

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

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