基于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打开一个库连接

_RecordsetPtr通常会返回一个记录集,以提供一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,可以用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。_RecordsetPtr可以用来打开库内数据表,并对表内的记录、字段进行操作。也可以先创建一个指针,再用Open打开一个记录集,然后对记录集内的记录、字段进行各种操作,包括添加、删除、修改等等。

来源:维库开发网


微信扫描分享本文到朋友圈
扫码关注5G通信官方公众号,免费领取以下5G精品资料

本周热点本月热点

 

  最热通信招聘

  最新招聘信息

最新技术文章

最新论坛贴子