基于VC++的制瓶机微机控制系统的串口通信
扫描二维码
随时随地手机看文章
制瓶机微机控制系统的基本功能是控制制瓶机的各个机械动作,使其按照设定程序进行工作。为了实现主机与下位机之间的控制操作和数据管理,需要通过串口连接具有数据采集和自动控制功能的下位机,然后由操作员通过操作上位机管理软件将操作命令传递给下位机来完成各种控制和管理工作,因此,串口通信技术是制瓶机微机控制系统开发的关键技术之一。
在VC环境下的制瓶机微机控制系统中,对于PC上位机的通信程序来说,其串口通信编程方法主要有三种:使用VC++提供的MSComm控件实现串口通信、基于某个串口通信C++类、基于API的串口通信。对于简单的串行口操作来说,前两种实现起来相对容易,使用也较方便、控制简单。但是,对于较为复杂的串行口操作,它则不够灵活。而基于API的串口编程方法则功能强大,控制手段更为自由灵活,可以编写出高效、功能强大的通信程序。对下位机来说,由于存储量有限,如果要存储大量数据必定会产生丢失现象,而将数据存储到上位机的数据库中,则可以弥补这个问题。因为VC++提供了多种数据库访问技术,例如ODBC、OLEDB、ADO等,其中ADO技术是基于OLEDB的访问接口,它继承了OLEDB技术的优点,并对OLEDB的接口作了封装,且定义了ADO对象,故可使程序开发得到简化,且基于ADO技术的应用程序可以通过一致的接口来访问各种各样的数据,同时也有利于程序的移植和扩充。
基于以上分析考虑,笔者重点论述了在VC++下如何使用API函数和ADO数据库编程技术来实现数据的实时采集,同时将数据实时保存到数据库中,从而完成制瓶机微机控制系统的主机与下位机间数据的实时操作与显示的具体方法。
利用WindowsAPI函数实现串口通信
在Windows环境下,串口是系统资源的一部分,当数据从CPU经过串行端口发送出去时,字节数据将转换为串行位;在接收数据时,串行的位又将被转换为字节数据。应用程序要使用串口进行通信,就必须在使用之前向操作系统提出资源申请(打开串口),还要设置通讯的串口地址、波特率、奇偶校验、数据位和停止位等相关配置,通信完成后,还必须释放资源(关闭串口)。
打开串口
串口通信程序以调用CreatFile()函数开始,该函数的返回值是一个句柄。可在随后的其它端口操作中使用。一旦端口处于打开状态,就可以自动分配一个发送/接收缓冲区,当然,也可以通过调SetComm()函数来改变发送/接收缓冲区的大小。
1.2配置串口
串口打开成功后。接着应进行串口的初始化,以配置串口的通信参数,如波特率、数据位数、停止位、校验位等。修改这些参数可使用设备控制块DCB(Device Control Block)。DCB是个复杂的结构,有近30个数据成员;但是,对于采用3线方式的串行通信来说,DCB结构中的大部分参数可以不用,只需要设置如波特率、数据位数、停止位、校验位等几个关键的参数就可以正常工作了。同时Windows提供有GetCommState()函数以获取串行接口的当前配置,故可使用SetCommState ()来重新配置串行接口的各个参数。
1.3串口的读/写操作
通过程序可以使用Win32API中ReadFile()函数从串口中读取数据,或使用WriteFile()函数向串口写入数据。如在串行接口通信中发生错误(如发生终端出错、奇偶校验等错误),I/O操作将会终止。此时,如果程序要进一步执行串行接口的I/O操作,则必须调用ClearCommError()函数来对串行接口进行恢复。
ClearCommError ()函数有两个作用:第一是清除错误条件;第二是确定串行接口通信状态。另外,对于串行接口,系统为其提供有一组通信事件及其相应的处理函数。Windows系统可在进程中监视发生在串行接口中的这组事件,因此,应用程序在不检查端口状态的情况下就可以知道某些条件何时发生。通过使用这些事件,应用程序就无需为接收字节而连续不断地检测端口,从而节省CPU时间。
关闭串口
在程序执行完毕后,退回Windows环境时,通常应关闭串口,以便其它程序使用。可以利用函数C10seHandle(Handle hObject)来停止一切串口的输入输出,参数hObject是CreateFile函数返回时,标志串口的通信句柄。
2 VC++中的ADO数据库使用
初始化OLE/COM库环境
创建一个标准的MFC AppWizard(exe)应用程序后,还要在应用程序类的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COMDLL库),其代码如下:
引入ADO库文件
使用ADO前,必须在工程的stdafx.h文件里直接引入符号#import来引AADO库文件,以使编译器能正确编译。其代码如下:
2.3 利用智能指针进行数据库操作
ADO库包含有3个智能指针:_ConnectionPtr、_CommandPtr、_RecordsetPtr。其中_ConnectionPtr通常用来打开、关闭一个库连接。为进行库连接,可先创建一个实例指针,再用Open打开一个库连接。下面以连接数据库db.mdb为例来加以说明:
_ConnectionPtr connectPtr;
connectPtr.CreateInstance("ADODB.Connection");//创建一个实例指针
connectPtr->Open("Provider=Microsoft.Jet.OLE.DB.4.0;DataSource="db.mdb"," "," ",
adModeUnKnown);//用Open打开一个库连接
[!--empirenews.page--]_RecordsetPtr通常会返回一个记录集,以提供一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,可以用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。_RecordsetPtr可以用来打开库内数据表,并对表内的记录、字段进行操作。也可以先创建一个指针,再用Open打开一个记录集,然后对记录集内的记录、字段进行各种操作,包括添加、删除、修改等等。
3制瓶机控制系统的串口通信
制瓶机控制系统的下位机由四个段控板和一个机控板组成,段控板的职责是控制制瓶机一段的所有动作,一般通过20路输出驱动20个电磁阀来实现;机控板的职责是根据现场机器的状态,为其它4个段控板提供基准信号和制瓶机的状态信息。通过上位机可设定不同段控板的电磁阀开闭值和产生基准信号所需要设定的值。制瓶机控制不同产品所对应的设定值也不相同。为了确保下位机运作的准确性,往往需要监控下位机当前状态和控制下位机不同段控板的单个电磁阀的起停。本系统的段控和机控板的主控芯片选用PIC24FJ64GA008,而上位机与下位机之间的通讯则遵循RS-232协议。
3.1 独立串口通信类的创建
创建独立的串口通信类的方法主要是在应用程序框架下,点击主菜单中的insert菜单下的NewClass项,并在弹出的对话框中的Class type中选择Generic Class。这是一种建立没有继承的类的方法。创建独立的串口通信类对串口操作的封装可以很好地实现各种自定义通信协议下的串口通信,而且符合面向对象的程序设计思想。本系统对串口的打开、初始化、读写、上位机发数据到下位机、下位机读数据到上位机、关闭等相关操作,都封装在windowsAPI函数写的独立串口类CcomPort中。当在每个要用到串口通信的窗体类中引用这个串口类后,就可以方便的使用。本系统是将PIC单片机通过端口COM1与计算机相连接,打开端口COM1的代码如下:
上位机与下位机之间可以2400 bps/秒的通讯速率传输数据,且无奇偶校验,包括八位数据位和一位停止位。可通过下面的参数来设置DCB参数,从而初始化串口。其具体代码如下:
DCB dcb;
dcb.BaudRate=CBR_2400;//波特率
deb.fParity=FALSE;//禁止奇偶校验
dcb.ByteSize=8;
dcb.Parity=NOPARITY;//无校验
dcb.StopBits=ONESTOPBIT;//一个停止位
3.2 存取串口命令数据
当上位机与PIC24FJ64GA单片机通过一系列应答联络后,单片机将开始向上位机发送存在EEPROM中的数据,从而将按照设定的协议组成的每帧11个字节由上位机一帧一帧地接收,并按字段存人数据库的相应表中,直到数据通信结束。在数据传输过程中,可通过一个循环结构并以查询方式从串口读取数据。为了避免因线路不通或通信过程中断而造成死机,程序中可加入自动退出机制,即在1秒钟之内没收到数据,程序自动提示没有接到数据。在设定好数据库db.mdb后,可由ADO访问数据库来进行串口数据的存取。具体步骤如下:
(1)在窗体类中引用串口类
在窗体类中引用串口类时,如果本窗体类是第一次引用,则定义CcomPort Obj_Commpon;如果在其它的窗口类已经定义过,则定义为extern CCommPort obj_Commport。调用串口类的函数可进行串口的初始化。
(2)发送控制命令给下位机
按照通讯协议发送控制命令给下位机,可告知下位机要跟上位机传送数据。下位机收到上位机的控制命令数据后,先进行校验,以检测上位机的命令是否正确。如果接到的数据是正确的。则返回正确的电磁阀开闭值;如果不正确,下位机则返回控制命令给上位机,告知上位机发送的数据不正确,此后上位机会再次发送控制命令给下位机,如果仍然不正确,则提示通讯出错,退出本次通信,然后再发送下一个命令。
(3)打开数据库并进行数据存取
首先打开数据库的连接。若m_pConnection在程序初始化中已经打开,则可在窗体类中直接调用,然后进行数据的存储。代码如下:
保存数据后,上位机再发控制命令给下位机,并开始接收下一条下位机传递过来的数据。上位机给下位机发送数据的过程与下位机给上位机发送数据的过程和步骤一样。退出程序时,关闭串口即可。
4结束语
串行通信具有实现简单、使用灵活方便、数据传输可靠等优点,因而在工业监控、数据采集和实时控制系统中得到了广泛应用。本文讲述在制瓶机控制系统中,在VC++环境下利用windows-API函数的串口编程技术和ADO数据库编程技术来实现和控制PIC单片机,以进行数据采集的具体方法。该方法同时会对通讯出错或通讯堵塞现象进行处理。实践证明,该方法可提高定时的精确性,从而提高产品的质量和产量。