第15章 串行通信原理与设计 浙江农林.ppt_第1页
第15章 串行通信原理与设计 浙江农林.ppt_第2页
第15章 串行通信原理与设计 浙江农林.ppt_第3页
第15章 串行通信原理与设计 浙江农林.ppt_第4页
第15章 串行通信原理与设计 浙江农林.ppt_第5页
免费预览已结束,剩余67页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、介绍串行通信的基本概念,包括串行通信的原理、传输协议以及各种串行传输的接口标准 最后讲解了Windows环境下,最常见的API编程方法,15.1 串行通信基本概念,通信,是在一些联络信号的控制下,一次将8位、16位或32位数据同时进行传送的通信方式。在并行通信中,传输线数量没有限制,除了数据线之外还应设置有通信联络控制线。 串行通信,只需一对传输线,数据的各位按照时间顺序依次传送,如8位数据分8次传送。,15.1.1 串行通信特点,由于在一条传输线上既传输数据信息,又传输控制联络信息,这就需要一系列约定,从而识别一条线上传送的信息流中,哪一部分是数据信号,哪一部分是联络信号。 串行通信的信息格

2、式有异步和同步信息格式。与此对应,有异步串行通信和同步串行通信两种方式。,由于串行通信中信息逻辑定义与TTL不兼容,故需要逻辑电平转换,以提高信息传输的可靠性。 为了降低通信线路的成本和简化通信设备,可用现存信道(如电话、电报信道等),配以适当的通信接口,在任意两点之间实现串行通信。,15.1.2 串行通信传输方式,串行通信的过程是将通信双方传输的数据序列变成电信号,在选定的通信线路上完成传递。通常,将通信传输方式分为信号传输方式和线路传输方式两部分。,1信号传输方式 在近距离传输时,广泛使用的是按信号原样传输的基波传输方式。 在远距离传输时,通常需要使用Modem。通过Modem,可以将原信

3、号调制为高频的模拟信号,然后通过电话网络,进行远距离传输。,2线路传输方式 在串行通信中,数据通常是在两个站(如微机、终端等)之间进行传送,按照数据流的方向及对线路的使用方式可分为如下几种基本传输方式:,单工传输方式。这种方式,在传输线路上,数据只能按一个固定的方向,且是交互式的。 半双工方式。当使用同一根传输线既作为输入又作为输出时,虽然数据可以在两个方向上传送,但通信双方不能同时收发数据,这种传输方式就是半双工传输方式。,全双工传输方式。当数据的发送和接收分别由两根不同的传输线传输时,通信双方都能在同一时刻进行发送和接收操作。 多工传输方式。使用复用技术,将一个信道(即传输信号的线路)划分

4、为若干个频带或时间片,从而使多路信号同时共享信道,这就是多工传输方式。,15.1.3 数据纠错与检错,在基本通信规程中一般采用奇偶校验或方阵码检错,以反馈重发方式纠错。在高级通信控制规程中,一般采用循环冗余码CRC(Cycle Redundancy Code)检验,以自动纠错方式来纠错。,首先,改善传输通道的电特性,使误码率达到要求,但是由于经济因素和技术因素等条件的限制,这方面的努力往往不能得到理想的效果; 其次,采取检错、纠错技术,即所谓差错控制技术,在差错控制技术中,对数据进行可靠有效地编码是很重要的途径之一。,15.1.4 传输速率与距离,传输速率和距离是衡量串行通信的两个重要方面。

5、通常串行通信涉及以下三个方面: 1波特率 2发送接收时钟 3传输距离与传输速率的关系,波特率 在并行通信中,传输速率以每秒传送的字节(B/s)数来表示,而串行通信中,在基波传输的情况下用每秒传送的位数(bit/s)来表示数据传输速率。 用的标准波特率是110、300、1200、2 400、4 800、9 600和19 200等。随着技术的进步,某些串行通信可以支持更高的波特率,如38 400、57 600等。,发送接收时钟 在发送数据时,发送器在发送时钟的有效沿(下降沿)作用下将移位寄存器的数据按位移位串行输出。 发送/接收时钟频率与波特率的关系如下: 发送/接收时钟频率n发送/接收波特率 表

6、达式中的n1,16,64。,传输距离与传输速率的关系 串行接口或终端直接传送串行信息流的最大距离与传输速率及传输线的电气特性有关,传输距离随传输速率的增加而减少。 RS-232C标准规定,当数据传送速度小于20kbit/s,并且电缆的电容负荷小于2 500pF时,传送距离小于30m。由于电缆的电容没有那么大,当传输速度较慢时,传输距离将超过这个距离。,15.2 串行传输协议,采用的串行通信协议有两类:异步通信和同步通信。 同步协议又分为面向字符、面向比特和面向字节计数3种。,15.2.1 异步传输协议,1特点及传输格式 在传输一个字符时总是以起始位开始,以停止位结束。异步通信传输格式如图15.

7、1所示。,图15.1 异步通信字符传输帧格式,2异步传输的错误检测 由于线路或程序出错等原因,使得通信过程中产生了传送错误。因为异步通信的实质是字符的发送是随机的,接收方通常可检测到如下一些错误:奇偶错、超越错、帧格式错。,15.2.2 面向字符的同步传输协议,1特点与格式 它的特点是一次传送由若干个字符组成的数据块,而不是只传送一个字符,并规定了10个特殊字符作为这个数据块的开头与结束标志以及整个传输过程的控制信息,它们也叫做通信控制字。由于被传送的数据块是由一序列字符组成的,故被称为面向字符的协议。协议的一帧数据格式如图15.2所示。,图15.2 面向字符的同步协议帧格式,由图15.2可知

8、,一个面向字符的数据帧由几个控制字符开始,紧跟着数据位数相同的各字符(1n),最后以校验字段结束。,2控制字符的定义 在面向字符同步协议的帧格式中规定了10个通信控制字符。面向字符协议中规定的10个通信控制字符的名称及代码如表15.1所示。,面向字符的同步通信有别于异步通信的一个特点是,它允许连续发送一序列字符,而每个字符的数据位数都相同,且没有起始位和停止位。 由于在面向字符的同步通信协议中采用了一些传输控制字,从而增强了通信控制能力和校验功能,但也出现了一些问题。,15.2.3 面向比特的同步传输协议,1特点与格式 面向比特的同步传输又称做二进制同步传输。在面向比特的同步协议中,最有代表性

9、的同步协议有如下3种: 同步数据链路控制规程SDLC(Synchronous Data Link Control),由IBM公司制定。,高级数据链路控制规程HDLC(High Level Data Link Control),由国际标准化组织ISO(International Standards Organization)制定。 先进数据通信规程ADCCP(Advanced Data Communications Control Procedure),由美国国家标准协会制定。,2帧信息的分段 SDLC/HDLC的一帧信息包括以下几个场,所有场都是从最低有效位开始传送。 SDLC/HDLC的标志

10、字符。SDLC/HDLC协议规定,所有信息传输必须以一个标志符开始,且以同一个标志符结束。这个标志符是01111110,称为标志场(Flag)。,地址场和控制场在标志场之后,可以有一个地址场A(Address)和一个控制场C(Control)。地址场用来规定与之通信的次站地址。控制场可规定若干个命令。 信息场(数据场)。跟在控制场之后的信息场I(Information)。信息场包含有要传送的数据,并不是每一帧都必须有信息场,即数据场可为0。当它为0时,则这一帧主要是控制命令。,帧校验场。紧跟在信息场之后的是两个字节的帧校验场,帧校验场称为FC(Frame Check)或称为帧校验序列FCS(F

11、rame Check Sequence)。SDLC/HDLC均采用循环冗余校验码CRC。其生成多项式为CCITT多项式x16+x12+x5+1。除了标志场和自动插入的“0”位外,所有的信息都参加CRC计算。,3实际应用时的几个技术问题 “0”位插入/删除技术。由于SDLC/HDLC协议规定以01111110为标志字节,但在信息场中也完全有可能有同一种模式的字符,为了能将它与标志区分开来,所以采取了“0”位插入和删除技术。,SDLC/HDLC异常结束。如果在发送过程中出现错误,则SDLC/HDLC协议用异常结束(Abort)字符,或称失效序列使本帧作废。 HDLC的3种基本通信操作方式。正常响应

12、方式(NRA),用于由一个主站和多个从站组成的多点式结构。异步响应方式(ARM),用于一个主站和一个从站组成的点点式结构,或者通信双方均由主站和从站叠加而成的平衡型结构。,同步通信中的纠错与数据帧重发。面向比特的同步协议中,由标志字段开始,紧跟着几千比特的信息,最后以具有自动纠错能力的CRC校验码结束。,15.3 使用 Windows API进行同步串口编程,如何使用API实现串口通信,对于数据的接收采用查询方式。 使用WinAPI来编写串口通信程序时,读写操作可以有同步方式与重叠的异步方式。,15.3.1 概述,所谓同步方式,就是当发出写命令后,直到数据确实写入到输出缓冲区后,写函数才返回。

13、这种方式操作简单,但当数据写入时间较长时,将会使程序挂起,降低程序的效率。,首先使用CreateFile()函数打开串口,以非重叠方式打开。该函数可以返回一个串口句柄,使用该句柄初始化串口参数。然后使用WriteFile()可以发送串行数据,使用ReadFile()可以从串口读取串行数据。操作完串口后,使用CloseHandle()函数来关闭串口。,15.3.2 创建串口,1CreateFil 该函数是一个通用的创建或打开文件的函数。在WinAPI编程中,它不仅可以操作文件,也可以操作串口。使用该函数可以打开一个串口,并返回一个句柄,在程序中便可以通过访问该句柄来实现对串口的访问。下面针对在串

14、口方面的应用介绍其参数的含义及设置方法。,HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );,2SetupComm()函数 设置串口输入缓冲区及输出缓冲区的大小。 BOOL SetupComm( HANDLE hFile, DWORD dw

15、InQueue, DWORD dwOutQueue );,3DCB数据结构 串口通信中,使用该数据结构存放通信参数。由于该结构包括的通信参数很多,逐个设置不方便。通常的做法是首先将串口的当前设置值读出到一个DCB结构中,然后根据需要修改该DCB结构中的某些参数,再以该结构来设置串口通信参数。,4SetCommState()函数 要设置串行通信参数,首先定义一个DCB结构类型的变量。根据通信要求,设置该结构变量的数值,然后以该结构变量作为参数,执行SetCommState()函数即可完成串口通信参数的设置。 BOOL SetCommState( HANDLE hFile, LPDCB lpDCB

16、 );,5GetCommState()函数 使用该函数可以获取当前串口通信参数的设置值。获取的参数值存放到一个DCB结构型的变量中。 BOOL GetCommState( HANDLE hFile, LPDCB lpDCB );,6举例说明 举例子说明创建串口的程序代码,串口参数在代码注释中说明。,15.3.3 关闭串口,关闭串口的操作很简单,只需执行CloseHandle()函数即可。 BOOL CloseHandle( HANDLE hObject /指向串口句柄 );,15.3.4 发送数据,发送数据使用WriteFile()函数。 BOOL WriteFile( HANDLE hFil

17、e, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped );,15.3.5 接收数据,接收数据使用ReadFile()函数。 BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );,15.3.6 定时接收数据的方法,1编写定时器响应

18、函数 定时器响应函数是全局函数,不属于任何类。直接在cpp文件中书写,格式如下:,VOID CALLBACK TimerProc( HWND hwnd, /发出定时器消息窗口的句柄 UINT uMsg, /WM_TIMER消息 UINT idEvent, /定时器ID DWORD dwTime) /当前的系统时间 /这里加入接收操作代码 该函数是一个回调函数。当设置的定时器时间达到时,由系统自动调用。调用该函数时,传入4个参数。,2启动定时器 启动定时器使用SetTimer()函数。该函数可在程序的任何地方加入。 UINT SetTimer( HWND hWnd, /发出定时器消息窗口的句柄

19、UINT nIDEvent, /定时器ID UINT uElapse, /超时值 TIMERPROC lpTimerFunc /定时器处理程序的地址 );,3关闭定时器 关闭定时器使用KillTimer()函数。该函数可在程序的任何地方加入。 BOOL KillTimer( HWND hWnd, / handle of window that installed timer UINT uIDEvent / timer identifier );,15.4 采用重叠I/O方式的编程方法,采用同步方式的查询方式读取串口数据时,若由于读取操作耗费较长的时间,则程序会被挂起。为解决这种问题,可以在读取

20、数据时采用重叠I/O操作。 为实现重叠I/O操作,主要有如下几个编程步骤:定义全局变量、创建串口、发出读写操作、读写线程函数的建立、关闭串口等。,15.4.1 定义全局变量,在主对话框的实现文件(后缀名为cpp)中定义全局变量。通常在该文件的最顶端,在所有函数的外面定义。,HANDLE hCom; /串口句柄 DWORD ThreadProcWrite(LPVOID pParam); /写线程函数 DWORD ThreadProcRead(LPVOID pParam); /读线程函数 OVERLAPPED Wol=0; /写操作 OVERLAPPED结构变量 OVERLAPPED Rol=0;

21、 /读操作OVERLAPPED结构变量 HANDLE hThreadWrite; /写线程句柄 HANDLE hThreadRead; /读线程句柄 HWND hWnd;,15.4.2 创建串口,创建串口的操作可以设置在一个按钮的单击事件中执行,也可以在主对话框的初始化函数OnInitDialog()中执行。,15.4.3 发出读写操作,1读操作 在读操作中,只是启动读线程。实际的读操作在读线程函数中完成。,2写操作 在写操作中,同样只是启动写线程。实际的写操作在写线程函数中完成。,DWORD dwThreadID;/ DWORD dwParam; hThreadWrite=CreateThr

22、ead(NULL, 0, (LPTHREAD_START_ROUTINE )ThreadProcWrite, /写线程函数名称 ,15.4.4 读写线程函数的建立,1读线程函数 在读线程函数中,首先应初始化重叠结构Rol的成员hEvent,将其设置为无信号状态。当读操作完成或出现通信错误时,该变量会被自动设置为有信号状态。接下来就可以使用ReadFile()函数发出读命令。若该读函数返回TRUE,说明读操作已经完成,可以处理读取的数据。若该读函数返回FALSE,说明读操作未完成。,2写线程函数 写线程函数所作操作与读线程函数的操作相似。首先初始化Wol的hEvent事件成员,然后发出写命令Wr

23、iteFile()。若该写命令返回TRUE,说明写操作成功完成。若写命令返回FALSE,说明写操作没有完成。,15.4.5 关闭串口,使用CloseHandle()函数关闭串口句柄。 CloseHandle(hCom);,15.5 采用事件驱动方式的编程方法,主要介绍在事件驱动方式下,实现串行通信的编程方法。本节内容涉及到重叠I/O操作、自定义Windows消息等概念。这些概念在与其相关的代码中详细说明。 这种方式的工作原理是建立一个事件线程,它监视串口的事件和错误信息。当有事件或错误发生时,它向主线程发送一个Windows消息。主线程在消息响应函数中处理已发生的事件或错误。采用这种方式编程,可以按照如下几个步骤进行,即:定义全局变量、创建串口、开启事件线程、发送数据、自定义消息、关闭串口及关闭事件线程。,15.5.1 定义全局变量,在主对话框的实现文件(后缀名为cpp)中定义全局变量。通常在该文件的最顶端定义,并在所有函数的外面。,15.5.2 打开串口及开启事件线程,1打开串口 hCom=CreateFile(COM2, /打开串口COM2 GENERIC_READ | GENERIC_WRITE,/使用读写方式 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论