当前位置:文档之家› 基于数据库和串口技术的数据监控系统

基于数据库和串口技术的数据监控系统

基于数据库和串口技术的数据监控系统
摘要:ADO和串口通信技术常用于数据采集监控等场合。

通过ADO 对象可以建立与数据库的连接,并读写数据库中的数据;利用串口通信程序可在上位机和下位机间进行数据传输。

介绍了ADO对象及其导入编程环境的方法,根据具体事例详细描述了利用ADO对象操作数据库,介绍了串口通信程序。

结果证明ADO和串口通信技术相结合可以更方便快捷地访问数据库。

关键词:VC++;ADO;数据库;串口;监控系统
0 引言
数据采集作为远程监控的重要组成部分,通常是创建一个普通数据文件如文本文件保存数据。

但当数据量很大时,频繁地读写将会消耗很多的系统资源,造成上位机负担加重,实时性恶化,利用数据库管理系统则能较好地解决这一问题。

串行通信因其简单方便、成本低廉、适合大规模长距离传输等优点,广泛地应用于远程监控系统中。

本文介绍了一种利用ADO技术访问数据库,实现串口数据采集存取的方法。

1 ADO数据库接口技术
1.1 ADO技术简介
ADO(ActiveX Data Object)是微软提出的一种应用程序接口,和DAO、RDO一样,均可以访问数据库中的数据。

它是一种功能强大的面向对象的数据访问编程模式,是对当前微软所支持的数据库进
行操作的最有效和最简单直接的方法。

由于微软开发的Visual C++语言支持COM库,所以可在VC编译环境下利用ADO对象访问数据库。

1.2 ADO数据库初始化
使用ADO访问数据库之前有两个准备步骤:①导入ADO类型库;②初始化COM库。

一般在stdafx.h头文件中,使用#import指令导入ADO类型库,程序语句如下:
#import“C:Program FilesCommon FilesSystemadomsado15.dll”no_namespace
rename(“EOF”,“adoEOF”)rename(“BOF ”,“adoBOF”)在调用ADO对象之前,必须先初始化库环境,调用结束后再释放资源。

在应用程序的InitInstance()成员函数中添加初始化函数::CoInitialize(NULL),在ExitInstance()成员函数中添加::CoUninitialize()函数释放资源。

1.3 链接数据库
ADO动态链接库定义了_ConnectionPtr智能指针用以创建一个数据库连接,返回一个记录集或空指针。

其操作步骤是:首先利用指针创建Connection对象,然后调用open()函数建立连接。

程序语句如下:
_ConnectionPtr pConnect;
pConnnect.CreateInstance(“ADODB.Connection”);//创建
Connection对象实例
pConnnect->Open(“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DataBase.mdb”,“”,“”,adModeUnknown);
其中“Microsoft.Jet.OLEDB.4.0”代表通过JET数据库引擎连接数据库,“DataBase.mdb”是登录的数据库名,可根据具体情况进行修改。

访问完数据库后,应该关闭与数据源的连接。

ADO在关闭连接的同时,也将关闭所有使用这个连接的ADO对象。

关闭连接的代码如下:
pConnnect->Close();
pConnnect.Release();
注意要先关闭连接,再释放组件接口。

1.4 操作记录集
ADO中定义了_RecordsetPtr智能指针,用其创建Recordset对象,完成对数据库的操作。

Recordset对象表示一个数据库表的记录集,或一个SQL语句的执行结果记录的集合。

一个Recorset对象由记录和列(字段)组成,是最重要且最常用于对数据库的数据进行操作的对象。

通过Recordset对象可以进行查询、添加、修改、删除记录的操作。

首先需打开记录集,声明一个_RecordsetPtr指针,调用CreateInstance()函数创建一个Recordset对象实例,然后调用Open ()函数打开记录集。

代码如下:
_RecordsetPtr pRset;
pRset.CreateInstance(_uuidof(Recordset));//创建Recordset 对象实例
pRset->Open(“SELECT * FROM AddressList ”,pConnection.GetinterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
通过一条SQL语句,以文本方式打开数据库中一个表AddressList 中所有内容,完成操作后,应关闭记录集,以释放之前占用的系统资源。

调用Recordset对象的Close()函数可以关闭记录集,代码如下:pRset.Close();
pRset.Release();
应先关闭记录集,后关闭连接。

2 监控系统串口通信
在监控系统中,下位机将采集到的数据通过串口线上传至上位机,上位机将接收到的数据存放到数据库中。

双方遵循相同的串口通信协议。

实现串口通信的方式主要由API函数实现、MSComm控件实现及利用CSerialPort类,三者各有特色。

本文采用串口类实现。

2.1 串口类CSerialPort
CSerialPort类一个非常好用的第三方多线程串口类,用它可以很方便快捷地完成一般串口编程任务,程序在Windows 98/NT/2000/XP 操作系统下均可很好地运行。

和MSComm控件相比,该类打包时无需加入其它文件,所有函数是开放、透明的,用户可根据自己的需求进行改造,编程者可以将更多的精力集中在串行通信协议的编制及数
据处理上。

2.2 串口收发
首先要进行串口初始化,利用open函数打开串口,设置串口号、串口波特率、奇偶校验、传输位数等参数,若打开成功则监控开始。

下位机确定发送的内容,通过SendData函数将已在缓冲区内的数据写到串行端口,返回已写到端口的实际字节数。

上位机通过ReadDataWaiting函数等待接收数据,当通信端口缓冲区中有数据时,通过ReadData函数读入。

当串口收发结束时,利用ClosePort函数关闭串口。

2.3 接收数据输入
在工程中,下位机根据串口协议依序传送设备ID号、数据序号、内容和采集时间4类数据,上位机根据需要生成该4个字段的数据库。

基于ADO技术可在初始化数据库后直接进行添加记录操作,实现容易。

voidCdataSaveDlg::OnAdd ()
{...
pRset ->AddNew();
if(pRset ->adoEOF&&m_nCurrentSel>=0)
{ pRset ->PutCollect(DBID,m_UserID);//分别存储各字段数据
pRset ->PutCollect(DBxuhao,m_Sn);
pRset ->PutCollect(DBshuju,m_Data);
pRset ->PutCollect(DBriqi,m_Time);
}...
}
通过AddNew函数向数据库添加一条记录,在_RecordsetPtr指针没有超出文件范围时,依序将数据内容添加至相应字段处。

3 结语
通过ADO技术和串口通信的结合,可以在数据量较大、较远距离上实现数据实时存储与传输,数据管理方便快捷,满足工程的实际需要。

实践证明,这是一种有效的方法。

参考文献:
[1] 李朝青.PC机与单片机&DSP数据通信技术选编[M].北京:北京航空航天大学出版社,2003.
[2] 李闽溟,吴继刚,周学明.VisualC++6.0数据库系统开发实例导航[M].北京:人民邮电出版社,2002.
[3] 费巧玲,徐向阳.VC 中用ADO实现大数据的存取[J].计算机工程与应用,2005(2).
[4] 何数有,钱海鹰,高昂.基于Win32平台下串口通信编程方法研究[J].计算机与数字工程,2007(5).
[5] 张延波,黄继祥.基于VC6.0的温度测量与控制系统的开发[J].机械与电子,2006(8).。

相关主题