搜档网
当前位置:搜档网 › 计算机网络实验指导

计算机网络实验指导

计算机网络实验指导
计算机网络实验指导

计算机网络实验指导

实验一异步串行通信实验

一、实验目的

?了解掌握RS-232接口标准以及DB9的主要引脚功能;

?了解掌握串口通信的基本原理;

?学习掌握RS-232电缆的制作和测试方法;

?学习掌握使用Visual C++进行串口编程的方法及其调试方法。

二、实验环境

为了完成异步串行通信实验,需要带有RS-232接口的计算机、铜缆、DB -9接口等设备和器件,具体需要的设备见下表1-1。其中为了完成RS-232接口的连线,电烙铁和焊锡是必需的。

表1-1 异步串行通信实验所需设备和器件清单

三、实验概述

1.异步串行通信

在计算机系统中,每个字符一般使用一个8位二进制代码表示。在数据通信中,通常将待传送的每个字符的二进制代码按照由低位到高位的顺序依次发送的方式称为串行通信,图1-1是串行通信的示意图。

图1-1 串行通信示意图

同步是数据通信中必需解决的一个重要问题。所谓同步就是要求数据的收发双方在时间基准上保持一致。在串行通信中,“异步”是同步收发双发通信的重要方式。在异步串行通信中,每个字符作为一个独立的整体进行发送,字符之间

的时间间隔可以是任意的。为了实现同步,需要在每个字符的第一位前加1位起始位(逻辑1),并在字符的最后一位后加1位、1.5位或2位停止位(逻辑0)。

常用的串行通信接口标准包括RS -232、RS -449、V .24、V .35等。其中RS -232是最常用的串行通信标准之一。个人计算机及终端系统中配备的串行接口几乎都符合RS -232标准。

2.RS -232接口标准

在数据通信中,通常将数据终端设备简称为DTE (Data Terminal Equipment ),而将数据通信设备简称为DCE (Data Circuit Equipment )。DTE 是具有一定数据处理能力及发送和接收数据能力的设备,而DCE 的主要作用是在DTE 和传输线路之间提供信号变换和实现编码功能,并且负责建立、保持和释放数据链路的连接。DTE 可以是计算机或终端,也可以是各种I/O 设备,而与模拟话路相连接的调制解调器(MODEM )则是典型的DCE 。RS -232的主要内容就是定义DTE 和DCE 之间的接口标准。

RS -232使用的连接器包括DB -25、D -15和DB -9等几种类型,不同类型连接器使用的引脚定义也各不相同。目前,个人计算机配备的RS -232连接器通常为DB9,它提供异步串行通信所需要的9个信号,其引脚的排列和信号名称如图1-2所示。

图1-2 RS -232在使用DB -9作为连接器时的引脚排列和信号名称

RS -232采用负逻辑,逻辑0相当于对信号地有+3~+15V 的电压,逻辑1相当于对信号地有-3~-15V 的电压。在-3V ~+3V 的过渡区,逻辑状态不定。RS -232串行口信号分为传送信号、联络信号和信号地3类。传送信号包括TxD (发送数据)和RxD (接收数据),它们是经由TxD 传送和RxD 接收的信息比特流。一个传送单位由起始位、数据位和停止位(有时还包含奇偶校验位)组成。

本次实验将两台计算机的串口进行直接连接,并通过简单的编程,实现键盘输入的对话功能,如图1-3所示。通过这个实验,要求可以较为深入的了解RS 数据载波检测

数据设备就绪 接收数据 发送数据 TxD 数据终端就绪 信号地 请求发送 允许发送

振铃指示

-232接口的主要特点,掌握RS-232接口的基本接线方法,学习利用高级语言控制个人计算机RS-232串行通信的基本过程。

图1-3 异步串行通信实验总体结构示意图

四、实验内容与步骤

1.制作RS-232电缆

RS-232定义的是DTE和DCE之间的接口标准,因此如果一个DTE设备(如个人计算机)和一个DCE设备(如MODEM)相连,连线相对比较简单,通常采用一对一的连接方法(即DTE接口的1引脚连接DCE接口的1引脚,DTE接口的2

引脚连接DCE接口的2引脚……)。在该实验中,由于两台计算机的距离较近,因此可以将DCE设备省略,用电缆直接连接两台计算机之间的RS-232接口。在这种情况下,最简单最常用的连线方法是3线连接法。本次实验使用3线连接法。

3线连接法只使用电缆中的3条线,一条作为信号地线,一条作为发送线,一条作为接收线。在连接这种电缆时需要注意,电缆中的发送线和接收线需要交叉,也就是说,一台计算机的RS-232发送引脚需要和另一台计算机的RS-232接收引脚相连,一台计算机的RS-232接收引脚需要和另一台计算的RS-232发送引脚相连,连接方法见图1-4所示。

图1-4 两台计算机RS-232接口的3线连接法示意图

按照图1-4所示将RS-232电缆焊接完成之后,可利用已有的串行口应用程序(如windows的“超级终端”)对制作的电缆进行测试,以确保电缆引脚连接的正确性,从而为通信程序的调试做好准备。

2.使用Visual C++进行串口通信编程

利用Visual C++在windows环境下设计异步串行通信程序可以使用不同的方法。一种方法可以使用windows系统提供的串行口API函数;另一种方法可以直接使用Microsoft公司提供的ActiveX控件MSCOMM.OCX。利用MSCOMM.OCX控件进行串行口程序设计相对比较简单,只要对该控件的属性、事件和方法进行设置和操作,就能完成简单的串行通信功能。而直接使用windows系统提供的串行口API函数则相对较为灵活。试验中,可根据自己的情况任意其中一种进行编程。以下针对如何使用windows系统提供的串行口API 函数进行编程做简要介绍。

在windows系统,串行口和其它通信设备都是作为文件进行处理的。串行口的打开、关闭、发送和接收所用的函数都与操作文件的函数相同。总体来说,利用Visual C++进行异步串行通信程序设计通常可以分为4个大阶段,它们是串行口打开阶段、串行口状态值读取和属性设置阶段、串行数据的发送与接收阶段,以及串行口关闭阶段。

(1)打开串行口

在对串行口进行所有的操作之前,首先要将其打开。串行口的打开可以使用CreateFile函数,CreateFile函数将返回一个句柄,在随后与该串行口相关的各种操作中使用。与文件操作相同,在利用CreateFile打开串行口时,也可以将串行口指定为“读访问权限”、“写访问权限”或“读写访问权限”。

HANDLE CreateFile(

LPCTSTR lpFileName

DWORD dwDesiredAccess

DWORD dwSharedMode

LPSECURITY_ATTRIBUTES lpSecurityAttributes

DWORD dwCreationDisposition

DWORD dwFlagsAndAttributes

HANDLE hTemplateFile

);

在调用成功时,CreateFile返回打开文件的句柄,该句柄将在以后与该串口相关的各个调用函数中使用。如果调用失败,则CreateFile返回INV ALID_HANDLE_V ALUE。

(2)串行口的状态读取和属性设置

一旦将串口打开,就可以对该串口的属性进行设置。由于串口的属性非常复杂,因此通常采用读取该串口当前状态值,然后在此基础上进行修改的方法。

?获取串行口当前状态

windows系统使用GetCommState函数获取串行口的当前配置,GetCommState的声明如下:

BOOL GetCommState(

HANDLE hFile

LPDCB lpDCB

);

GetCommState函数的第一个参数hFile是由CreateFile函数返回指向已打开串行口的句柄。第二个参数指向设备控制块DCB。DCB是一个非常重要的数据结构,几乎所有的串行口属性和状态都存储在该结构的成员变量中。

?对串口进行设置

windows系统利用SetCommState函数修改串行口的当前参数配置。SetCommState函数声明如下:

BOOL SetCommState(

HANDLE hFile

LPDCB lpDCB

);

GetCommState函数的第一个参数hFile是由CreateFile函数返回指向已打开串行口的句柄。第二个参数指向设备控制块DCB。如果函数调用成功,则返回值为非0;若函数调用失败,则返回值为0。当应用程序仅仅需要修改一部分串行口的配置值时,可以通过GetCommState函数获得当前的DCB结构,然后更改参数,再调用SetCommState函数设置修改过的DCB来配置串行口。

?为串口分配接收和发送缓冲区

当一个串行口打开时,可以为该串口分配一个发送缓冲区和一个接收缓冲区。串行口发送缓冲区和接收缓冲区的配置可以由函数SetupComm实现。如果不调用SetupComm,系统会为该串口分配默认的发送缓冲区和接收缓冲区。但是为了保证缓冲区的大小与实际需要的一致,最好调用该函数进行设置。SetupComm函数原型如下:

BOOL SetupComm(

HANDLE hFile

DWORD dwInQueue

DWORD dwOutQueue

);

其中hFile是由CreateFile函数返回指向已打开串行口的句柄。参数dwInQueue和dwOutQueue分别指定应用程序推荐使用的接收缓冲区和发送缓冲区的大小。

?清空接收和发送缓冲区

在进行串口所有的发送和接收数据操作之前,最好使用PurgeComm函数将串行口发送缓冲区和接收缓冲区中的数据清楚干净。PurgeComm函数原型如下:BOOL PurgeComm(

HANDLE hFile

DWORD dwFlages

);

参数hFile是由CreateFile函数返回指向已打开串行口的句柄,参数dwFlags 指明执行的动作。如果dwFlags为PURGE_TXCLEAR,则通知系统清空发送缓冲区;如果dwFlags为PURGE_RXCLEAR,则通知系统清空接收缓冲区;如果需要将发送缓冲区和接收缓冲区全部清空,可以把dwFlags设置为PURGE_TXCLEAR|PURGE_RXCLEAR。如果PurgeComm函数调用成功,则返回值为非0;若函数调用失败,则返回值为0。

(3)串行数据的发送和接收

与普通的文件操作相同,在对串行口进行操作时,通常利用ReadFile函数读取串行口收到的数据,利用WriteFile将需要发送的数据写如串行口。

?串行数据的接收

利用ReadFile函数可以读取将串行口接收到的数据。ReadFile函数原型如下:BOOL ReadFile(

HANDLE hFile

LPVIOD lpBuffer

DWORD nNumberOfBytesToRead

LPDWORD lpNumberOfBytesRead

LPOVERLAPPED lpOverlapped

);

其中参数hFile指向已经打开的串行口句柄;lpBuffer指向一个读取数据缓冲区;nNumberOfBytesToRead指定要从串行设备中读取的字节数;lpNumberOfBytesRead指明实际从串行口中读出的字节数;lpOverlapped指向一个OVERLAPPED结构变量,该结构变量中包含一个同步事件。

通常如果调用成功,ReadFile返回非0值;否则返回值为0。但是对于接收操作在后台进行的串口来说,返回值为0不一定说明函数调用失败。此时可以调用GetLastError函数获取进一步的信息。如果GetLastError返回值为ERROR_IO_PENDING,则说明该读取串口的操作仍然处于后台等待状态,而非一个真正意义上的错误。

串行数据的发送

利用WriteFile函数可以向串行口写入数据。WriteFile函数原型如下:

BOOL WriteFile(

HANDLE hFile

LPVIOD lpBuffer

DWORD nNumberOfBytesToWrite

LPDWORD lpNumberOfBytesWritten

LPOVERLAPPED lpOverlapped

);

其中参数hFile指向已经打开的串行口句柄;lpBuffer指向一个发送数据缓冲区;nNumberOfBytesToRead指定要从串行设备中发送的字节数;lpNumberOfBytesRead指明实际从串行口中发送的字节数;lpOverlapped指向一个OVERLAPPED结构变量,该结构变量中包含一个同步事件。

通常如果调用成功,WriteFile返回非0值;否则返回值为0。但是对于发送操作在后台进行的串口来说,返回值为0不一定说明函数调用失败。此时可以调用GetLastError函数获取进一步的信息。如果GetLastError返回值为ERROR_IO_PENDING,则说明该写入串口的操作仍然处于后台等待状态,而非一个真正意义上的错误。

(4)关闭串行口

在用完串行口后通常要将其关闭。如果忘记关闭,该串口会始终处于打开状态,其它的应用程序就不能打开或使用它。

关闭串口可以使用函数CloseHandle,其函数原型如下:

BOOL CloseHandle(

HANDLE hObject

);

CloseHandle函数非常简单,其中hObject为该打开串口的句柄。如果该函数调用成功,则返回值为非0;否则返回值为0。

五、思考与练习

在完成实验的过程中请思考以下问题:

1.在动手编程之前,请设计程序的调试方法和步骤。同时请思考所设计的调试方法的特点和优越性。

2.除了以上介绍的发送和接收控制方法之外,串行口的发送、接收、错误控制也可以通过事件通知的方式进行。请查阅相关资料,学习使用事件通知完成串口通信的方法。

相关主题