Visual C++程序设计教程(第二版)课件:串口通信程序的开发_第1页
Visual C++程序设计教程(第二版)课件:串口通信程序的开发_第2页
Visual C++程序设计教程(第二版)课件:串口通信程序的开发_第3页
Visual C++程序设计教程(第二版)课件:串口通信程序的开发_第4页
Visual C++程序设计教程(第二版)课件:串口通信程序的开发_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

串口通信程序的开发

12.1串口通信的内部机制

应用程序经常要与外部设备进行通信,这种通信通常是通过一个标准的并行口和两个串行口进行的。外部设备主要是与并行口相连的打印机,与串口相连的调制解调器、鼠标以及其他与串口、并口相连的仪器设备。12.1.1Windows串行通信的工作原理

常用的DOS系统主要是工作在响应中断方式。PC机串行通信程序大多利用其BIOS块的INT14H中断,以查询串口的方式完成异步串行通信。 与DOS响应中断的工作方式不同,Windows是一个事件驱动的,并与设备无关的多用户操作系统。同时Windows禁止应用程序直接和硬件交互,程序员只能通过Windows提供的各类驱动程序来管理硬件。在这种情况下,Windows系统充当了应用程序与硬件之间的中介。12.1.2串行通信的操作方式下面介绍串行通信的几种操作方式:1.同步方式 同步方式中,读串口的函数试图在串口的接收缓冲区中读取规定数目的数据,直到规定数目的数据全部被读出或设定的超时时间已到时才返回。2.查询方式 查询方式,即一个进程中的某一线程定时地查询串口的接收缓冲区,如果缓冲区中有数据,就读取数据;若缓冲区中没有数据,该线程将继续执行,因此会占用大量的CPU时间,它实际上是同步方式的一种派生。3.异步方式 异步方式中,利用Windows的多线程结构,可以让串口的读写操作在后台进行,而应用程序的其他部分在前台执行。4.事件驱动方式 若对端口数据的响应时间要求较严格,可采用事件驱动方式。事件驱动方式通过设置事件通知,当所希望的事件发生时,Windows发出该事件已发生的通知,这与DOS环境下的中断方式很相似。12.1.3单线程与多线程下的串口通信通常可按以下四步实现串行通信:按协议的设置初始化并打开串行口,这样做就是通知Windows本应用程序需要这个串口,并封锁其他应用程序使它们不能使用此串口。配置这个串口。在串口上往返地传输数据,并在传输过程中进行校验。不需要此串口时,关闭串口。即释放串口以供其它应用程序使用。在这四个步骤中,主要的程序代码集中在第(3)步。12.2串口通信的实现12.2.1串口的初始化

在Win32位环境中,串口和其它通讯设备都作为文件处理。串口的打开、关闭、读取、写入所用到的函数与文件操作所用到的函数相同。 串口通讯程序以调用CreateFile()函数开始,该函数的返回值是一个通信资源句柄,在随后的其它端口操作中使用。 一旦当端口处于打开状态,就可以自动分配一个发送/接收缓冲区,当然也可以调用SetComm()函数改变发送/接收缓冲区的大小。12.2.2串口的配置

当用CreateFile函数打开一个串行通信资源句柄时,系统将根据资源最近一次被打开时的设置,来初始化和配置资源。如果设备从没有被打开过,将使用系统的缺省值进行配置。 设备控制块(DeviceCentrolBlock,DCB)通过用户编程,就可以实现对串口的配置。串行口和串行通信驱动程序是通过一个数据结构进行配置的,这个数据结构被称为设备控制块(DeviceControlBlock),简称DCB。DCB结构的成员,确定了资源配置的设置。12.2.3超时设置

通信资源句柄有一套影响读写操作的相关的超时参数,当一个超时后,就能引起各种操作的结束,即使指定数目的字符尚未读写完。在读写操作中发生超时并不作为错误处理。利用超时参数可以定义两种超时:间隔超时-当接收到相邻字符的时间间隔超过给定的毫秒数时,间隔超时将发生。从接收第一个字符开始计时,当接收到一个新的字符时重新开始计时。总量超时-当读写花费的时间操作超过计算出的毫秒数时,总量超时将发生。计时从I/O操作开始后立即进行。写操作只支持总量超时,读操作支持两种超时,可以单独使用或组合使用。 超时参数的设置可以用COMMTIMEOUTS结构实现。12.2.4串口的写操作

在串口配置成功后,下一步就可以进行读/写串口的操作了。写串口程序相对比较简单,调用WriteFile()函数就可以实现。函数调用的一个例子如下:

WriteFile(hCom1,out,length,&nToWrite,&o);

其中hCom1是串口的句柄,out为指向存储写入数据的缓冲区,length表示要发送的数据长度,nToWrite为实际写入的字节数,&o为指向一个OVERLAPPED结构,使数据的写操作在后台进行。12.2.5

串口的读操作

实现读串口的关键在于判断何时去读才能读完全部的数据。首先用SetCommMask()函数设置的事件掩码值为EV_CHAR,使WaitCommEvent()函数能够在接收到一个字符,并放入输入缓冲区,从而退出等待。再利用ClearCommError()函数得到一个COMSTAT结构,而其中在COMSTAT的成员变量cbInQue为接收缓冲区中实际的数据数。只要WaitCommEvent()函数结束等待状态,程序就继续执行。下一步,判断输入缓冲区是否为零,如不是就可以开始读串口的操作。 读串口使用ReadFile()函数,一个调用的例子如下:

ReadFile(hCom1,input,cs.cbInQue,&nBytesRead,&o);12.2.5

串口的读操作(续)

在这里还使用了几个其它的函数,下面也将介绍:SetCommMask(hCom1,EV_RXCHAR);WaitCommEvent(hCom1,&dwEvent,NULL);ClearCommError(hCom1,&dwError,&cs);12.2.6关闭串口

在程序执行完,退回到Windows环境时,要关闭串口,以便其它程序能使用。关闭串口很简单,用下面函数实现:

CloseHandle(hCom1); //hCom1为串口的句柄。12.3串口通信程序举例

本节讲述一个具体的串口通信的实例,该实例是在工控以太网通信协议解密所用到的一个串口通信程序,这里实现的是通信协议解密的软件部分。 该软件设计的目的就是接收来自过程级和监控级两处发送的信号,也就是它们互答的通讯的协议。即该软件的功能在于从串口1和串口2接收数据,从串口1接收过程级的数据,从串口2接收监控级的数据。由于监控级和过程级的通信是突发或连续的,实时性较高,为了防止任何数据的丢失,这里将采用多线程技术。12.3.1建立基于对话框的程序

建立基于对话框的程序Eg12_1,删除对话框资源默认的一个静态控件和两个按钮控件。修改对话框资源的Properties属性。12.3.2添加控件在对话框资源上添加如下表12.1所示控件。12.3.3为控件建立相关联的成员变量如表12.2所示:

12.3.4建立按钮的消息响应函数voidCEg12_1Dlg::OnConfig(){ //TODO:Addyourcontrolnotificationhandlercodehere

COMMCONFIGcc; cc.dcb=dcb; if(!CommConfigDialog("com1",GetSafeHwnd(),&cc))return;

dcb=cc.dcb; SetCommState(hCom12,&dcb); }12.3.5重载对话框类的初始化函数OnInitDialog()函数第一步,在初始化以前需要定义程序用到的结构和变量第二步,把串口的初始化、配置放在对话框类的OnInitDialog()函数中。第三步,启动读线程。在初始化串口后,就要启动读线程进行监控串口。因此,把启动读线程程序放在了对话框类的OnInitDialog()函数的最后。线程启动程序如下:voidCEg12_1Dlg::OnReceive(){//定义一个句柄,用于读线程。HWNDhWndread=GetSafeHwnd();//启动读线程.AfxBeginThread(ReadProc,hWndread,THREAD_PRIORITY_NORMAL);//在这里ReadProc就是读线程程序}第四步,加入用户自定义消息12.3.6程序运行结果运行程序,点击按钮“配置

温馨提示

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

评论

0/150

提交评论