毕业设计(论文):智能环境监控系统设计_第1页
毕业设计(论文):智能环境监控系统设计_第2页
毕业设计(论文):智能环境监控系统设计_第3页
毕业设计(论文):智能环境监控系统设计_第4页
毕业设计(论文):智能环境监控系统设计_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计说明书(论文)作者:学号:学院:计算机工程学院专业:通信工程题目:智能环境监控系统设计指导者:(姓名)(专业技术职务)评阅者:(姓名)(专业技术职务)20年月毕业设计说明书(论文)中文摘要针对智能环境监控系统,开发了无线传感器网络硬件传感器节点、执行器节点和上位机监控软件。节点通过无线传感器节点来采集环境光照强度和温度,判断参数是否超出正常范围并智能控制执行器使环境参数恢复到正常范围。同时把传感节点信息发送给协调器,无线传感器网络中的协调器节点和上位机通过串口进行数据通信,以监测和控制无线传感器网络。采用VisualC++6.0编程语言,在MFC的基于对话框模式下通过编辑MSComm控件实现了串口通信,利用各种相关类函数及自编函数、数据库连接等在上位机界面上实现了传感器网络拓扑图显示、节点传感量数据显示、控制传感器节点等主要功能。关键词无线传感器网络,环境监控,串口通信毕业设计说明书(论文)外文摘要TitleDesignofIntelligentenvironmentmonitoringsystemAbstractThetopicfocusonthedesignof

nodesofnetworkandactuator,PCsoftwareinintelligentenvironmentalmonitoringsystemofwirelesssensornetworks.Wirelesssensornetworkthroughthewirelesssensornodetocollecttheenvironmentaltemperatureandlightintensity,judgingwhethertheparameterisoutsideofthenormalrangeandintelligentcontrolofactuatormakestheenvironmentparametersreturnedtonormalrange.Atthesametimethenodemessagetothecoordinator,wirelesssensornetworksinthecoordinatornodeandthehostcomputerthroughserialdatacommunications,tomonitorandcontrolthewirelesssensornetwork.ThesoftwareusestheVisualC++6.0programlanguage,basedonthedialogboxinMFCmodebyeditingtheMSCommserialcommunicationcontrol,usingavarietyofrelatedfunctionandwritingfunction,databaseconnection,thehostcomputerinterfacerealizationofsensornetworktopologydisplay,nodesensingvolumedatadisplay,controlsensornodemainlyfunction.Keywordswirelesssensornetworks,environmentalmonitoring,serialcommunication毕业设计说明书(论文)第II页共II页毕业设计说明书(论文)第Ⅰ页共I页目录TOC\o"1-2"\u1引言 11.1课题研究背景及意义 11.2国内外研究与发展现状 11.3课题研究的主要内容 41.4小结 42智能环境监控系统总体方案设计 42.1系统总体设计框图 42.2上位机软件总体设计 52.3系统硬件总体设计 72.4小结 83软件详细设计 83.1软件总体结构 83.2界面设计 93.3主界面主要附属功能实现 153.4自定义WSN串口通信协议 213.5传感器数据显示 233.6数据库实现 253.7小结 284智能环境控制系统硬件详细设计 284.1温度采集模块设计 284.2光照采集模块设计 294.3执行器模块设计 304.4硬件程序设计 314.5小结 365系统测试 375.1硬件测试 375.2软件测试 39结论 41致谢 42参考文献 43毕业设计说明书(论文)第4页共44页1引言1.1课题研究背景及意义无线传感器网络(WirelessSensorNetwork,WSN)是当前国际上备受关注的由多学科交叉的新兴前沿研究热点领域[1]。无线传感器网络是由部署在监测区域内大量的廉价小型或微型无线传感器网络节点组成,通过无线通信形成一个多跳的自组织智能网络系统[2]。传感器网络综合了传感器技术、嵌入式计算技术、无线网络通信技术、分布式信息处理技术以及微机电技术等,能够通过各类集成化的微型传感器协作地实时监测、感知和采集各种环境或监测对象的信息,通过嵌入式系统对信息进行处理,并通过随机自组织无线通信网络以多跳中继方式将信息传送到终端用户,从而实现无处不在的计算理念[3]。其应用前景非常广阔,现正逐步深入到人类生活的各个领域,比如国防军事、反恐抗灾、环境监测、交通管理、工程安全、医疗护理、建筑结构、健康监测等。环境监测控制是一类典型的无线传感器网络应用,早在2002年英特尔公司就率先在俄勒冈州建立了世界上第一个无线葡萄园,并获得了成功[4]。环境监测系统帮助管理人员对设备和现场进行实时监控,预防故障发生或在故障发生后能提供及时的资料。自动监测系统可以减少配备人员的数量并提高监测业务的效率。现有自动监测系统大都采用有线技术进行传感器网络的组建。这类方案扩展性能差,布线烦琐,线路容易老化,更换起来也十分不方便。采用无线方式构建环境监测系统,则可以避免这些不必要的麻烦。而且,无线方式相对灵活,只要在有效范围内,传感器终端可以依据要求随意安放[5]。ZigBee是一种新兴的近距离、低复杂度、低功耗、低数据速率、低成本的无线网络技术,主要用于近距离无线连接传输。它依据IEEE802.15.4标准,在数千个微小的传感器之间相互协调实现通信。这种技术在楼宇自动化、工业监控领域具有非常广阔的市场空间[6]。因此,基于ZigBee的智能环境监控系统的设计在环境监控中有很大的应用价值和前景。1.2国内外研究与发展现状目前,由传感器、微处理器和无线通信接口组成的无线传感器网络得到了空前的发展。由大量的无线传感网络节点自组织组成的无线传感网络能够广泛应用于环境科学、医疗健康、空间探索、智能家居、军事、交通、采矿和灾难拯救等各个领域,无线传感网络已成为下一代“计算无处不在”的关键技术。传感器网络的研究起步于20世纪90年代末期。从2000年起,国际上开始出现一些有关传感器网络研究结果的报道。目前传感器网络已经引起了世界许多国家的军事部门、工业界和学术界的极大关注。美国自然科学基金委员会2003年制定了传感器网络研究计划,投资3400万美元,支持相关基础理论的研究。美国很多大学都已开展传感器网络的研究,其中最具代表性的是加州大学伯克利分校和Intel公司联合成立的“智能尘埃”实验室,它的目标是为美国军方提供能够在一立方毫米的体积内能自动感知和通信设备原型的研制。2001年中科院依托上海微系统所成立微系统研究与发展中心,引领院内的相关工作,并通过该中心在无线传感网络的方向上陆续部署了若干重大研究项目和方向性项目,参加单位包括上海微系统所、声学所、微电子所、半导体所、电子所、软件所、中科大等十余个校所,初步建立传感网络系统研究平台,在无线智能传感网络通信技术、微型传感器、传感器节点、簇点和应用系统等方面取得很大的进展。2004年9月相关成果在北京进行了大规模外场演示,部分成果已在实际工程系统中使用。国内的许多高校也掀起了无线传感网的研究热潮。清华大学、中国科技大学、浙江大学、华中科技大学、天津大学、南开大学、北京邮电大学、东北大学、西北工业大学、西南交通大学、沈阳理工大学和上海交通大学等单位纷纷开展了有关无线传感网方面的基础研究工作。一些企业如中兴通讯公司等单位也加入无线传感网研究的行列[7]。国内外对温室环境控制技术的研究较早,始于上世纪70年代,先是采用模拟式的组合仪表,采集现场信息并进行指示、记录和控制。80年代末出现了分布式控制系统,现阶段开发和研究集中于计算机数据采集控制系统的多因子综合控制系统、多数据融合技术等。目前,世界各国的环境控制技术发展很快,一些国家在实现自动化的基础上正向着完全自动化、无人化的方向发展[8]。环境监控应用的典型案例有:夏威夷大学在夏威夷火山国家公园部署了WSN进行生态环境监测,用来监测那些濒临灭种的植物所在地的微小气候变化,以揭示为何特定物种只能生存在某些特定环境中[9]。韩国研究人员ByungrakSon,Yong-SorkHer,KyuwonShim将WSN部署到山地旅游区,来监测旅游者的数目[10]。监测海燕生存环境及其在气候变化时行为的GDI项目[11]。该系统将传感器获取的温度、湿度和气压等环境信息以多跳路由的方式发送到监测管理中心,管理中心使用这些信息可以在不干扰野生动植物正常生活的情况下监视其活动和生存环境。美国学者RichardBeckwith,DanTeibel,PatBowen将无线传感器网络放置在葡萄园中[12]。通过对葡萄园环境的监测来提高作物的品质。研究者通过与农业领域的专家合作,分析了湿度、温度和病虫害对葡萄成熟度和品质的影响。澳洲的科学家利用无线传感器网络来探测北澳大利亚蟾蜍的分布情况[13]。由于蟾蜍的叫声响亮而独特,因此利用声音作为检测特征非常有效。科研人员将采集到的信号在节点上就地处理,然后将处理后的少量结果数据发挥控制中心。通过处理,就可以大致了解蟾蜍的分布、栖息情况。美国研究者F.J.Pierce,T.V.Elliott在华盛顿东部的农场部署了环境监测无线传感器网络[14]。该系统除了自身的监测功能外还与相应的控制系统相结合,当测得的环境温度低于某个预先设定的临界值时,系统可以自动启动温控设备,防止出现冻害。国内中国矿业大学学者王晓东、赵晓光等研制了用于煤矿环境监测的环境监测的无线传感器网络系统[15]。该系统基于加州大学伯克利分校的TMoteSKY节点和TinyOS操作系统,可以用来监测煤矿内部的环境变化,同时还能实现矿工的定位。重庆大学的研究者王韬、苏勤亮、唐松、唐浦钊将无线传感器网络应用到了西双版纳的自然保护区内[16]。该系统结合了GPRS、GIS、红外夜视和GPS等技术,实现了自然保护区生态环境信息的监测、动物活动路线规律的跟踪、新动物的发现、火灾等自然灾害的预警、以及巡护管理等功能。电子科技大学、中国空气动力研究与发展中心以及北京航天指挥控制中心的研究人员,利用无线传感器网络进行大型风洞测控环境的监测,对旋转机构,气源系统、风洞运行系统,以及其他没有基础设施而有线传感器系统安装又不方便或不安全的应用环境进行全方位检测[17]。成都无线龙通讯科技有限公司和北京市奥尔斯电子科技有限公司已开发出无线传感器网络智能监控软件,分别是C51RF-WSN监控软件V3.00和奥尔斯物联网综合教学实验平台。近几年随着无线传感器网络的不断发展,以及软硬件设备的逐渐成熟。世界范围内环境监控领域无线传感器网络的应用越来越广泛,新技术和新想法不断涌现,相信在环境和农业监控领域会有广泛的应用前景。1.3课题研究的主要内容本课题围绕智能环境监控系统进行分析和设计。针对以CC2430芯片为核心的传感器节点组成的传感器网络系统,设计出节点的硬件控制部分,编写嵌入式程序完成节点的智能控制功能。采用VisualC++6.0应用程序开发环境,编写程序完成监控传感器网络的上位机软件。研究的主要内容有:a)节点的硬件设计,包括各个传感器设计、信息处理模块、电源模块和控制执行器模块设计;b)采用ZigBee点对多点通信技术协议,应用无线传感器网络节点设计方案;c)对传感器节点进行程序编写的IAR嵌入式工作平台;d)软件设计基本概念和过程;e)单片机与计算机的串口通信技术;f)VisualC++6.0应用程序开发环境;g)软件和硬件调试。1.4小结本章对无线传感器网络作了简要介绍,阐述了智能环境监控系统近几年的发展状况,结合本课题给出了课题研究的主要内容。从中可以了解到智能环境监控系统的应用已经发展到多方领域,其实际应用价值正逐渐凸显。2智能环境监控系统总体方案设计2.1系统总体设计框图电源模块电源模块处理器模块无线射频模块(CC2430)温度采集模块(DS18B20)光照采集模块(光敏电阻)温度执行器(风扇)光照执行器(台灯)无线传感器节点协调器(CC2430)用户界面(上位机软件)WSN串口图2.1智能环境监控系统设计框图如图2.1,智能环境监控系统分为无线传感器网络硬件部分和上位机监控软件部分。硬件部分主要由无线传感器网络节点组成。节点根据传感器采集到的数据进行判断环境参数是否异常,如果异常则启动执行器使环境参数恢复到预设值。同时节点把信息发送给网络协调器,由网络协调器把数据整合通过串口发送到上位机软件。上位机软件对接收到的数据进行显示,记录各个时间的环境参数变化。用户可以通过上位机软件设定环境参数的上下限,手动打开或关闭执行器。同时把接收到的数据和操作执行器的记录记录到数据库,方便查询。2.2上位机软件总体设计2.2.1功能需求对于智能环境监控系统,上位机软件具备的基本功能是实时显示网络的拓扑结构,监测各传感器节点采集到的数据、执行器的状态并对传感器进行必要的控制。实时显示传感器状态实时显示传感器状态实时显示传感器网络拓扑结构发送命令和激励信号结构数据库实时记录数据结构上位机软件图2.2智能监测无线传感器网络软件功能如图2.2,上位机软件主要具备四大功能:实时显示传感器状态、实时显示传感器网络拓扑结构、发送命令和激励信号、数据库实时记录数据。借助于IAR嵌入式程序开发平台和VisualC++6.0开发环境,以上功能均具有可行性。上位机与协调器通信在硬件上通过在两者间连接串口线实现,软件上则在VisualC++6.0环境下对MSComm控件的OnComm事件进行程序编写完成。协调器节点与上位机之间相互传送数据采用自定义数据帧格式可更加贴合用户需求。自定义串口通信协议涉及协调器与上位机两方的程序编写,通俗的说是一种“事前约定”,在约定中对数据格式、同步方式、传送速度、传送步骤、检错方式以及控制字符定义等做出统一规定,协调器和上位机必须共同遵守。为此,需在IAR环境下完成对协调器程序的编写,使其能够对上位机发来的数据包根据协议约定进行提取识别,进而响应相应的命令;在VisualC++6.0环境完成对上位机软件相关程序编写,使其能对协调器发来的数据包根据协议约定进行提取识别以监测整个无线传感器网络。2.2.2软件总体框架根据软件的需求分析设计出软件的几大模块,其框架如图2.3所示,从中我们可以看到各模块之间的内在联系。操作控制模块操作控制模块分析模块监视显示模块数据库模块图2.3智能环境监控系统软件框架图操作控制模块:通过监控软件实现对系统的基本设置,主要包括设置串口号、串口波特率、校验类型、设置环境参数的上下限等。另外可对指定节点发送命令或激励信号。监视显示模块:对无线传感器网络进行监测,实时显示网络拓扑结构并能根据用户设置将指定节点采集的温度、光照,执行器状态等基本信息进行可视化显示。分析模块:对采集的各种监测数据进行处理。数据库模块:保存历史实测数据,执行器运行状态历史等。2.2.3各模块任务分配针对操作控制模块,主要任务是在MFC环境下通过编辑MSComm控件的各种属性,使得用户可选择性设置各种串行口通信参数。另外编程实现向传感器节点发送控制命令的功能。针对监视显示模块,主要任务运用MFC中各控件的编程方法及一些必要的绘图知识在界面显示各传感器节点信息、绘制实时网络拓扑图。针对分析模块,主要任务是对采集来的各种监测数据进行处理。针对数据库模块,主要任务是运用VisualC++与数据库的连接技术,完成VisualC++到数据库的数据存储以及数据库表格在VisualC++界面上的显示。2.3系统硬件总体设计2.3.1节点功能分析智能环境监控系统无线传感器节点,能够实时监测、传递环境信息,调节环境参数,支持无线通信。节点可以通过无线传感器网络建立连接,通过传感器采集环境数据。判断环境参数是否正常,若不正常,则启动执行器调节环境参数。同时使用串口把数据传到上位机软件进行处理。这些功能可概括如下:(1)节点数据采集:通过温度传感器、光照传感器实时采集数据。(2)节点通信协议:采用无线通信ZigBee中SPP(简单包协议)协议完成端到端的数据传输。(3)节点数据分析:分析采集到的环境数据,判断是否超出预设值的上下限。若超出预设值,则启动执行器使环境恢复正常。(4)执行器模块:受分析模块的控制。执行器模块信息采集模块执行器模块信息采集模块节点数据分析执行器模块执行器模块SPP协议串口图2.4节点功能结构图2.3.2节点硬件组成节点硬件由无线传感器节点模块、处理器模块、无线射频模块、执行控制器模块和电源模块组成。其中,无线传感器模块由温度传感器DS18B20模块、光照传感器光敏电阻模块组成。处理器和无线射频模块采用CC2430芯片。执行控制器模块由电磁继电器和风扇台灯组成。电源模块分为两部分,CC2430芯片由两节电池供电,继电器风扇由220V交流电供电。由无线传感器节点采集环境数据信息,通过处理器处理判断,控制环境。同时通过无线射频模块把节点状态发送给数据接收模块,数据接收模块通过串口把数据发送给上位机软件。2.4小结本章对智能环境监控系统做了总体设计,包括上位机软件和硬件的总体设计。根据各部分的功能需求,设计了总体设计框架及其功能模块,明确了为实现各功能需要完成的具体任务。3软件详细设计3.1软件总体结构3.1.1软件界面总体框架图主界面主界面菜单栏工具栏TAB1TAB2端口设置阀值设置其他节点属性节点树拓扑图阀值与控制数据库图3.1智能监测无线传感器网络系统软件界面总体框架图3.1.2软件各部分介绍根据图3.1所示的软件界面总体框架图,对图中各部分做简要介绍如下:菜单栏:菜单栏提供一些必要的操作。本软件菜单栏提供的操作有:设置(端口设置,阀值设置)、通讯(查看串口,打开串口,关闭串口)、视图(拓扑图,阀值与控制,数据库)等。工具栏:工具栏选取菜单栏中常用操作,通过编辑按钮实现菜单栏中的部分功能,是菜单栏选项的一种快捷操作。本软件工具栏“复制”了菜单栏选项中的“查看串口”、“端口设置”、“打开串口”、“关闭串口”等功能。Tab控件1:Tab控件可在程序运行时选择打开选项卡中对应的窗口,操作简单,较友好。Tab控件1下设两个窗口,分别为节点树窗口和节点属性窗口。节点树窗口截取拓扑图窗口中显示的拓扑图,方便用户在做控制与测试网络时,直接获取网络拓扑信息;节点属性窗口对指定的传感器节点显示其网络属性及所含传感器感测的数据。Tab控件2:Tab控件2下设三个子窗口,分别为拓扑图窗口、阀值与控制窗口和数据库窗口。拓扑图窗口显示当前传感器网络拓扑结构;阀值与控制窗口对指定节点的环境参数上下限的设定、继电器的开关控制;数据库窗口用于显示实时更新的数据表。3.2界面设计3.2.1概述基于更加贴合用户需求的思想,本软件共设计了7个界面,分别是智能环境监控系统软件主界面、系统设置子界面、传感器网络节点树子界面、传感器网络节点属性子界面、传感器网络拓扑图子界面、传感器网络阀值设置与控制界面、数据库子界面。以下是对各界面作的详细说明。3.2.2主界面建立一个MFCAppWizard[exe]工程,工程名称为“wsnd”,采用基于对话框模式,各设置采用默认状态,进入一个系统自生成的工程。主界面的样式如图3.2所示,ID为IDD_WSND_DIALOG,标题为“智能环境监控系统”。主界面共放置三个控件,分别是一个MSComm控件和两个Tab控件。由于VisualC++集成开发环境在默认情况下,不会包含MSComm控件,所以使用MSComm控件必须先将其加载到VisualC++集成开发环境。在VisualC++主界面中,单击【工程】|【添加工程】|【ComponentsandControls】|【RegisteredActiveXControls】|【MicrosoftCommunicationsControl,version6.0】|【Insert】|【确定】|【OK】|【结束】即可将MSComm控件加载进VisualC++工具箱中供使用。图3.2智能环境监控系统软件主界面表3-1为主界面控件的设置表。表3-1主界面控件设置表控件ID标题功能MSComm控件IDC_MSCOMM1无上位机与协调器串口通信所需Tab控件1IDC_TABFORMER无显示节点树及节点属性窗口Tab控件2IDC_TABLATTER无显示拓扑图、阀值与控制、数据库窗口3.2.3端口设置子界面在工程中插入一个新的对话框,ID为IDD_DIALOG_PORTSET,标题为“端口设置”。其界面如图3.3所示,共放置8个控件,分别为3个静态文本控件、3个组合框控件、2个按钮控件。图3.3系统设置子界面表3-2为端口设置子界面控件设置表。表3-2端口设置子界面控件设置表控件ID标题功能静态文本1IDC_STATICCOM端口提示作用静态文本2IDC_STATIC波特率提示作用静态文本3IDC_STATIC校验类型提示作用组合框1IDC_COMBO_COM无列出COM口供选择组合框2IDC_COMBO_BAUDRATE无列出波特率供选择组合框3IDC_COMBO_PARITY无列出校验类型供选择按钮1IDOK确定确定当前的系统设置按钮2IDCANCEL取消取消当前的系统设置3.2.4传感器网络节点树子界面在工程中插入一个新的对话框,ID为IDD_DIALOG_NODETREE,如图3.4所示。设置其属性样式为“Chind”,为作为主界面Tab控件1的第一个显示窗口做准备。图3.4节点树子界面表3-3为传感器网络节点树子界面控件设置表。表3-3传感器网络节点树子界面控件设置表控件ID标题功能树形控件IDC_TREE_NODETREE无显示节点树按钮1IDC_BUTTON_NTSTOP暂停刷新暂停节点树动态更新按钮2IDC_BUTTON_NTSX刷新中节点树动态更新3.2.5节点属性子界面在工程中插入一个新的对话框,ID为IDD_DIALOG_NODEPROPERTY,设置其属性样式为“Child”,为作为主界面Tab控件1的第二个显示窗口做准备。其界面如图3.5所示,共放置24个控件,分别是11个静态文本控件、8个编辑框控件、1个组合框控件、4个按钮控件。图3.5节点属性子界面表3-4为节点属性子界面主要控件设置表。表3-4节点属性子界面主要控件设置表控件ID功能编辑框1IDC_EDIT_NPNODEADD显示节点地址编辑框2IDC_EDIT_NPNODETYPE显示节点网络类型编辑框3IDC_EDIT_NPNMADD显示节点MAC地址编辑框4IDC_EDIT_NPFNMADD显示父结点MAC地址编辑框5IDC_EDIT_NPSENNUM显示传感器类型编辑框6IDC_EDIT_NPTEMPER显示温度值编辑框7IDC_EDIT_NPLIGHT显示光电值编辑框8IDC_EDIT_NPJDQ显示继电器状态组合框IDC_COMBO_NPNODESELECT列出活动的节点供选择3.2.6拓扑图子界面在工程中插入一个新的对话框,ID为IDD_DIALOG_TOPUTABPAGE,设置其属性样式为“Child”,为作为主界面Tab控件2的第一个显示窗口做准备。其界面如图3.6所示,共放置10个控件,分别是3个静态文本控件、5个图像控件、1个按钮控件、1个编辑框控件。图3.6拓扑图子界面按钮控件的ID为IDC_BUTTON_TOPUCD,标题为“拓扑图保存”。主要控件的设置如表3-5所示。表3-5拓扑图子界面主要控件设置控件ID类型功能图像控件1IDC_STATIC_PICTOPU矩形显示拓扑图图像控件2IDC_STATIC_PICDANGER图标显示危险图标编辑框控件IDC_EDIT_DANGER无显示危险信息3.2.7阀值与控制子界面在工程中插入一个新的对话框,ID为IDD_DIALOG_CONTROL,设置其属性样式为“Child”,为作为主界面Tab控件2的第二个显示窗口做准备。其界面如图3.7所示,共放置22个控件,分别是10个静态文本控件、2个组框控件、4个单选按钮控件、1个按钮控件、1个组合框。图3.7阀值与控制子界面表3-6为阀值与控制子界面主要控件设置表。表3-6阀值与控制子界面主要控件设置表控件ID标题功能编辑框1IDC_WENDUMAX_EDIT无显示温度最大值编辑框2IDC_GUANGZHAOMAX_EDIT无显示光照最大值编辑框3IDC_WENDUMIN_EDIT无显示温度最小值编辑框4IDC_GUANGZHAOMIN_EDIT无显示光照最小值单选按钮1IDC_OPENFENGSHAN开控制电扇开单选按钮2IDC_OPENFENGSHAN开控制台灯开单选按钮3IDC_CLOSEFENGSHAN关控制电扇关单选按钮4IDC_CLOSETAIDENG关控制台灯关按钮1IDC_CONTROL_OK确定确定数据发送组合框IDC_COMBO_Nodesel无列出节点供选择3.2.8数据库子界面在工程中插入一个新的对话框,ID为IDD_DIALOG_DBTABPAGE,设置其属性样式为“Child”,为作为主界面Tab控件2的第四个显示窗口做准备。其界面如图3.8所示,共放置3个控件,分别是1个列表框控件、2个按钮控件。图3.8数据库子界面表3-7为数据库子界面控件设置表。表3-7数据库子界面控件设置表控件ID标题功能列表框IDC_LIST_DB无显示表单选按钮1IDC_BUTTON_DBDATA历史实测数据打开“历史实测数据表”单选按钮2IDC_BUTTON_DBYZ当前阈值打开“阈值表”3.3主界面主要附属功能实现3.3.1菜单栏用户与应用程序的交互通常是通过菜单栏中的命令实行的,因此,菜单在应用程序中占有很重要的位置。本软件是基于对话框模式的,故程序没有自动生成菜单栏,需要自行添加。单击【插入】|【资源】|【Menu】|【新建】即可向当前工程添加一个新菜单,默认ID为IDR_MENU1。打开工作空间中的ResourceView选项卡,可对此新菜单做编辑。如图3.9所示为本软件菜单栏菜单项。图3.9菜单栏菜单项表3-8为菜单栏的详细设置表。表3-8菜单栏的详细设置表一级菜单标题一级菜单ID二级菜单标题二级菜单ID设置(&S)无系统设置ID_Menu_PortSet阈值设置ID_Menu_FZSet通讯(&C)无查看串口ID_Menu_PortSee打开串口ID_Menu_PortOpen关闭串口ID_Menu_PortClose视图(&V)无拓扑图ID_MENU_TOPUVIEW阀值与控制ID_MENU_CONTROL数据库ID_MENU_DATABASE对菜单栏进行各菜单项设置后,在主对话框属性中将菜单选为IDR_MENU1,这样在运行程序时菜单栏方可见。另外,需对菜单栏编辑响应事件方可发挥其功用。在菜单资源中右击菜单项,选择建立类向导,选择COMMAND消息,添加对应的功能函数。对主要菜单项编程如下:(1)“端口设置”菜单项对照“界面设计”中的“端口设置”对话框,参看“端口设置”菜单项代码如下:voidCWsndDlg::OnMenuPortSet()//串口参数设置:串口号,波特率,校验位{ CStringstrStatus,strTemp; if(m_Portset.DoModal()==IDOK) { if(m_Portset.m_Com=="COM1") myCom=1;elseif(m_Portset.m_Com=="COM2") myCom=2;elseif(m_Portset.m_Com=="COM3") myCom=3;elseif(m_Portset.m_Com=="COM4") myCom=4;elseif(m_Portset.m_Com=="COM5") myCom=5;elseif(m_Portset.m_Com=="COM6") myCom=6; else if(m_Portset.m_Com=="COM7") myCom=7;elseif(m_Portset.m_Com=="COM8") myCom=8;elseif(m_Portset.m_Com=="COM9") myCom=9;elseif(m_Portset.m_Com=="COM10") myCom=10; if(m_Portset.m_Baudrate=="2400") myBaudRate="2400";elseif(m_Portset.m_Baudrate=="4800") myBaudRate="4800";elseif(m_Portset.m_Baudrate=="9600") myBaudRate="9600";elseif(m_Portset.m_Baudrate=="19200") myBaudRate="19200";elseif(m_Portset.m_Baudrate=="38400") myBaudRate="38400";elseif(m_Portset.m_Baudrate=="57600") myBaudRate="57600";elseif(m_Portset.m_Baudrate=="115200") myBaudRate="115200"; if(m_Portset.m_Parity=="无校验") myParity="N"; elseif(m_Portset.m_Parity=="偶校验") myParity="O"; elseif(m_Portset.m_Parity=="奇校验") myParity="E"; CStringstrPara,strTemp;//串口参数 strPara="COM"; strTemp.Format("%d",myCom); strPara+=strTemp; strPara+=","; strPara+=myBaudRate; strPara+=","; strPara+=myParity; AfxMessageBox(strPara); UpdateData(FALSE);}}(2)“查看串口”菜单项查看串口的功能通过访问注册表信息来实现,主要代码如下:voidCWsndDlg::OnMenuPortSee()//查看串口{ //TODO:Addyourcommandhandlercodehere CStringstrCommArr; CStringstrTemp; HKEYhKey; intrtn; rtn=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Hardware\\DeviceMap\\SerialComm",NULL,KEY_READ,&hKey);//打开注册表 if(rtn==ERROR_SUCCESS) { inti=0; charportName[256],commName[256]; DWORDdwLong,dwSize; while(1) { dwSize=sizeof(portName); dwLong=dwSize; rtn=RegEnumValue(hKey,i,portName,&dwLong,NULL,NULL,(PUCHAR)commName,&dwSize); strCommArr=commName; if(rtn==ERROR_NO_MORE_ITEMS)//枚举串口 break; strTemp+=strCommArr; strTemp+="可用!"; strTemp+="\15\12"; i++;} RegCloseKey(hKey);} AfxMessageBox(strTemp);}添加以上代码后,PC机连接串口,点击“查看串口”,得其效果如图3.10所示。图3.10查看可用端口(3)“打开串口”菜单项打开串口功能所用关键代码为:voidCWsndDlg::OnMenuPortOpen()//打开串口{ //TODO:Addyourcommandhandlercodehere CStringstrPara;//串口参数 myComm.SetCommPort(myCom);//指定串口号myCom strPara=myBaudRate; strPara+=","; strPara+=myParity; strPara+=",8,1"; myComm.SetSettings(strPara);//通信参数设置 myComm.SetInBufferSize(1024);//指定接收缓冲区大小 myComm.SetInBufferCount(0);//清空接收缓冲区 myComm.SetInputMode(1);//设置数据为二进制获取方式 myComm.SetInputLen(41);//设置每次读取长度为41个字节 myComm.SetRThreshold(1);//OnComm事件门限值 myComm.SetPortOpen(1);//打开串口 AfxMessageBox("串口打开成功!");}添加以上代码后,已查看端口可用,点击“打开端口”,得其效果如图3.11所示。图3.11串口打开成功(4)“关闭串口”菜单项关闭串口功能所用关键代码为:myComm.SetPortOpen(0);//关闭串口“视图”菜单下的“拓扑图”菜单项拓扑图菜单项的关键代码如下:voidCWsndDlg::OnMenuTopuview()//拓扑图菜单项{ //TODO:Addyourcommandhandlercodehere m_tab2.SetCurSel(0); m_topu.ShowWindow(true);m_kz.ShowWindow(false); m_sjk.ShowWindow(false);}3.3.2工具栏同插入菜单栏的方法,插入一个工具栏,ID为IDR_TOOLBAR。双击工具栏上的按钮,设置ID号即完成一个工具栏按钮的新建任务。选取功效易读的图标,引入为工程的Icon资源。选取作用的对象,通过单击【编辑】|【复制】或【粘贴】可将图标加载进工具栏对应按钮,使界面更加美观可读。如图3.12所示为本软件工具栏外观图。工具栏按钮从左到右依次复制了菜单栏的“查看端口”、“端口设置”、“打开串口”、“关闭串口”等功能。图3.12工具栏外观图只需将工具栏按钮的ID改成相应菜单项的ID,即可使按钮具有对应菜单项的功能。至此,最后的问题是工具栏的显示问题以及“工具按钮提示”的显示问题。(1)虽然添加了工具栏资源并对其按钮ID做了编辑,但仅此在运行程序时工具栏是不可见的,更无法对其按钮操作。在主对话框初始化代码段中添加如下代码使工具栏可视化:cToolBar.Create(this);//创建工具栏cToolBar.LoadToolBar(IDR_TOOLBAR);//装载工具栏资源cToolBar.LoadBitmap(IDB_BIT_toolbar);cToolBar.ShowWindow(SW_SHOW);//显示窗口cToolBar.SetBarStyle(CBRS_ALIGN_TOP|CBRS_TOOLTIPS|CBRS_FLYBY);//设置工具栏风格(顶端停靠、光标在按钮上停留显示工具提示和命令描述)RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);(2)工具栏按钮提示可在其属性中添加。但程序运行时鼠标移到按钮区域时不会有提示信息,原因是在基于对话框模式下,“工具栏提示”的相应代码没有被系统封装,需手动添加。而在基于单文档模式下,就没有这种顾虑。添加代码及过程如下:a.在wsndDlg.h文件的//{{AFX_MSG(CWSNJKDlg)…//}}AFX_MSG之后添加: afx_msgBOOLOnToolTipText(UINTnID,NMHDR*pNMHDR,LRESULT*pResult); DECLARE_MESSAGE_MAP()b.在wsndDlg.cpp文件的消息映射函数最后添加:ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW,0,0xFFFF,OnToolTipText)//用于工具栏按钮//显示信息ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA,0,0xFFFF,OnToolTipText)//用于工具栏按钮//显示信息c.在在wsndDlg.cpp文件中添加:BOOLCWsndDlg::OnToolTipText(UINT,NMHDR*pNMHDR,LRESULT*pResult){ASSERT(pNMHDR->code==TTN_NEEDTEXTA||pNMHDR->code==TTN_NEEDTEXTW);//ifthereisatoplevelroutingframethenletithandlethemessage if(GetRoutingFrame()!=NULL)returnFALSE;//tobethoroughwewillneedtohandleUNICODEversionsofthemessagealso!! TOOLTIPTEXTA*pTTTA=(TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW*pTTTW=(TOOLTIPTEXTW*)pNMHDR; TCHARszFullText[512]; CStringstrTipText; UINTnID=pNMHDR->idFrom; if(pNMHDR->code==TTN_NEEDTEXTA&&(pTTTA->uFlags&TTF_IDISHWND)||pNMHDR->code==TTN_NEEDTEXTW&&(pTTTW->uFlags&TTF_IDISHWND)) { //idFromisactuallytheHWNDofthetool nID=::GetDlgCtrlID((HWND)nID);} if(nID!=0)//willbezeroonaseparator { AfxLoadString(nID,szFullText);//#include<afxpriv.h>forAfxLoadString strTipText=szFullText;#ifndef_UNICODE if(pNMHDR->code==TTN_NEEDTEXTA) {lstrcpyn(pTTTA->szText,strTipText,sizeof(pTTTA->szText));} else {_mbstowcsz(pTTTW->szText,strTipText,sizeof(pTTTW->szText));}#else if(pNMHDR->code==TTN_NEEDTEXTA) {_wcstombsz(pTTTA->szText,strTipText,sizeof(pTTTA->szText));} else {lstrcpyn(pTTTW->szText,strTipText,sizeof(pTTTW->szText));}#endif *pResult=0; //bringthetooltipwindowaboveotherpopupwindows::SetWindowPos(pNMHDR->hwndFrom,HWND_TOP,0,0,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); returnTRUE;}}3.3.3主界面Tab控件本软件共设有两个Tab控件,参考主界面从左往右分别简称为Tab控件1、Tab控件2。软件设计中主界面Tab控件需要实现以下功能:(1)Tab控件1可根据用户选择,显示“节点树”对话框及“节点属性”对话框两者之一。(2)Tab控件2可根据用户选择,显示“拓扑图”对话框、“阀值与控制”对话框及“数据库”对话框三者之一。为此,共分三步完成。第一步:新建五个对话框,标题分别是“节点树”、“节点属性”、“拓扑图”、“阀值与控制”、“数据库”,其样式均为“Child”。建立步骤如“界面设计”中所述。第二步:为每个对话框建立一个新类。双击对话框,在跳出的对话框中选择“建立一个新类”,输入自定义的类名,选择基类,确定后即建立了一个新类。五个对话框的类名及基类对应表如表3-9所示。表3-9Tab控件下对话框类名与基类对应表对话框标题对话框ID对话框类名对话框基类节点树IDD_DIALOG_NODETREECNodetreeCDialog节点属性IDD_DIALOG_NODEPROPERTYCNodepropertyCDialog拓扑图IDD_DIALOG_TOPUTABPAGECTabPage1CDialog阀值与控制IDD_DIALOG_CONTROLCControlCDialog数据库IDD_DIALOG_DBTABPAGECTabPage3CDialog第三步:编程实现Tab控件对相应对话框的调用显示。a.声明Tab控件变量分别为m_tab1、m_tab2。b.在主对话框wsndDLG.h头文件中声明被调用对话框的实例。CNodepropertym_nodeproperty;//节点属性实例CNodetreem_nodetree;//节点树实例CTabPage1m_topu;//拓扑图实例CControlm_kz;//阀值与控制实例CTabPage3m_sjk;//数据库实例c.在主对话框OnInitDialog()函数中添加代码进行子对话框的显示设置。以Tab控件1为例,代码如下://设置Tab控件1m_tab1.InsertItem(0,_T("节点树"));//添加选项卡一m_tab1.InsertItem(1,_T("节点属性"));//添加选项卡二//关联对话框,并且将IDC_TABFORMER控件设为父窗口m_nodetree.Create(IDD_DIALOG_NODETREE,GetDlgItem(IDC_TABFORMER));m_nodeproperty.Create(IDD_DIALOG_NODEPROPERTY,GetDlgItem(IDC_TABFORMER));//获得IDC_TABFORMER客户区大小CRectrc;m_tab1.GetClientRect(&rc);//调整子对话框在父窗口中的位置rc.top-=20;rc.bottom-=20;rc.left-=20;rc.right-=2;//设置子对话框尺寸并移动到指定位置m_nodetree.MoveWindow(&rc);m_nodeproperty.MoveWindow(&rc);//分别设置隐藏和显示m_nodetree.ShowWindow(true);m_nodeproperty.ShowWindow(false);//设置默认的选项卡m_tab1.SetCurSel(0);d.通过编辑Tab控件的OnSelchange事件实现Tab控件的选择性显示子对话框功能。以Tab控件1为例,编码如下:voidCWsndDlg::OnSelchangingTabformer(NMHDR*pNMHDR,LRESULT*pResult)//第一个Tab控件选项卡选择{ //TODO:Addyourcontrolnotificationhandlercodehere intCurSel1=m_tab1.GetCurSel();switch(CurSel1){case0:m_nodetree.ShowWindow(false);m_nodeproperty.ShowWindow(true);break;case1:m_nodetree.ShowWindow(true);m_nodeproperty.ShowWindow(false);break;default:;} *pResult=0;}3.4自定义WSN串口通信协议3.4.1概述通信协议是指通信双方的一种约定,在约定中对数据格式、同步方式、传送速度、传送步骤、检错方式以及控制字符定义等做出统一规定,通信双方必须共同遵守[18]。目前,采用的串行通信协议有两类:异步通信和同步通信。同步通信协议又分为面向字符、面向比特、面向字节计数3种[17]。由于异步通信每次发送一个字符都加起始位及停止位等附加位,使其通信效率比较低,因此异步通信一般用在数据速率较慢的场合(如小于10.2kbit/s)。本软件采用同步通信协议,面向字节计数。3.4.2自定义WSN串口通信参数在串口通信前,必须设置串行口的通信参数,包括通信的波特率、数据位数、起始位、停止位及奇偶校验位等。对于单片机来说,有些参数是固定的,如数据位数是8位,起始位是1位,停止位是1位。可变的参数只有波特率和奇偶校验类型。上位机端在使用MFC中MSComm控件进行串口通信编程时,系统默认的串口波特率数值、数据位数、停止位数分别为9600、8、1。此外还要约定通信的数据格式、设置好串口号等。如图3.13为本软件串口通信协议约定的上行数据包格式,图3.14为下行数据包格式。包头Start1字节节点地址Address2字节节点Mac地址Mac8字节父节点Mac地址PaMac8字节节点网络类型NetType1字节传感器类型Type1字节传感器包尾End1字节‘#’‘C’—协调器‘R’—路由器‘E’—终端设备WD—温度GZ—光照‘@’测量光照值2字节测量温度值2字节继电器状态1字节00—关01—开图3.13上位机串口接收的数据包格式包头Start1字节节点地址Address2字节节点Mac地址Mac8字节节点网络类型NetType1字节传感器类型Type1字节控制量包尾End1字节‘#’‘C’—协调器‘R’—路由器‘E’—终端设备WD—温度GZ—光照‘@’温度最大值2字节温度最小值2字节光照最大值2字节光照最小值2字节继电器状态1字节00—关01—开图3.14上位机串口发送的数据包格式3.4.3串口接收数据实现MSComm是Microsoft提供的一个ActiveX控件,用于简化串口程序开发,试用MSComm控件,用户不必了解复杂的API函数,通过MSComm控件的属性、方法和事件,就可以和思想串口操作的大部分功能。MSComm控件只提供一个OnComm事件,该事件在串口状态发生改变时触发。例如,用户在发送和接收数据时,将触发OnComm事件。发送数据时,事件返回数值1;接收数据时,事件返回数值2[19]。串口接收数据的关键代码如下:voidCWsndDlg::OnOnCommMscomm1(){ CStringstrDis,strSum; BYTErxdata[2048]; COleSafeArraysafearray1; VARIANTinput1; longlen1,k; CStringstradd="";//临时地址读取变量 switch(myComm.GetCommEvent()) { case2://收到RTHreshold个字符 input1=myComm.GetInput();//读取输入缓冲区的字符,读取字节数为SetRTHreshold()设置的值 safearray1=input1; len1=safearray1.GetOneDimSize();//得到有效数据长度 for(k=0;k<len1;k++) safearray1.GetElement(&k,rxdata+k); for(k=0;k<len1;k++) { if(rxdata[k]==35)//判断是否是以包首字符“#”开头 { for(intn=k;n<len1;n++) {if(rxdata[n]==40)//包尾字符“@”结束的字符串 break; BYTEbt=*(char*)(rxdata+n);//字符型 strDis.Format("%c",bt);//将字符送入临时变量strSum存放 strSum+=strDis; }}} strDis=""; stradd=strSum.Mid(1,4);//截取字符串,第一个参数为截取位置,第二个参数为截取长度。 intj; if(stradd=="0002")//节点1 { j=1; Transfer(strSum,j);//对节点j更新} if(stradd=="0003")//节点2 { j=2; Transfer(strSum,j);//对节点j更新 }}voidCWsndDlg::Transfer(CStringstrSum,intnum)//节点数据传输函数,将接收到的//数据按地址放入对应节点{ CNode::nodeadd[num]=strSum.Mid(1,4); CNode::nodemac[num]=strSum.Mid(5,16); CNode::fnodemac[num]=strSum.Mid(21,16); CNode::nodetype[num]=strSum.Mid(37,1); ……}3.5传感器数据显示3.5.1传感器数据显示实现思想实时显示传感器数据功能的实现思想主要是以下几点:第一:借助MFC中的MSComm控件,将协调器节点通过串口传来的数据包整包收下,存放于一个CString变量(假设为m_str)中;第二:建立一个全局类,类中保存由m_str转换截取后的各节点的所有信息,另外还有一些标志性变量(如用于判断该节点是否存在的变量);第三:根据用户选择,将全局类中对应节点信息显示在“节点属性”对话框的各编辑框中,并进行实时更新。3.5.2传感器数据显示实现过程如图3.15所示为显示传感器数据功能实现过程框架。开始开始用户选择节点按下GO按钮(定时开始)按下STOP按钮(定时结束)定时时间到显示节点信息是是否否图3.15传感器数据功能实现过程框架3.5.3传感器数据显示实现(1)通过MSComm控件的OnComm事件接收协调器节点串口发来的数据,赋给一个CString变量,此变量即为“上位机经串口接收数据编程实现”中所述的strSum变量。(2)用于保存各节点信息的全局类的建立a.单击【插入】|【类】,输入类名为CNode,所属基类为CWinThread,完成后即得到Node.h和Node.cpp文件。在Node.h中对静态数据成员声明如下:staticCStringnodeadd[10];staticCStringnodemac[10];staticCStringfnodemac[10];staticCStringnodetype[10];staticCStringsentype[10];staticCStringsenlight[10];staticCStringsentemper[10];staticCStringZTstate[10];staticintZTtemper;staticintZTlight;staticCStringmaxtemper[10];staticCStringmintemper[10];staticCStringmaxlight[10];staticCStringminlight[10];staticintRTflag;b.在Node.cpp文件中对静态数据成员初始化,需要注意的是必须在类外初始化。主要代码如下:CStringCNode::nodeadd[10]={"空","空","空","空","空","空","空","空","空","空"};CStringCNode::nodetype[10]={"空","空","空","空","空","空","空","空","空","空"};CStringCNode::sentype[10]={"空","空","空","空","空","空","空","空","空","空"};CStringCNode::nodemac[10]={"空","空","空","空","空","空","空","空","空","空"};…..(3)用户选择性查看节点信息用户根据自己的选择,查看实时更新的节点信息。在此,实时显示需启动定时器,调用SetTimer函数。MFC中SetTimer函数原型为:UINTSetTimer(UINTnIDEvent,UINTnElapse,void(CALLBACKEXPORT*lpfnTimer)(HWND,UINT,YINT,DWORD)),第一个参数为定时器ID,多个定时器时,可以通过该ID判断是哪个定时器;第二个参数为时间间隔,单位为毫秒;第三个参数为回调函数,NULL表示当定时至1000ms时,系统自动触发对话框的OnTimer事件。在Nodeproperty.cpp文件中添加如下代码:CStringCNodeproperty::OnSelchangeComboNpnodeselect()//获得用户选择的节点{ CStringstrTemp; intiindex=m_ComboNP.GetCurSel();m_ComboNP.GetLBText(iindex,strTemp); //SetTimer(1,1000,NULL);returnstrTemp;}voidCNodeproperty::OnButtonNpjudge()//判断按钮按下的奇偶次数{ switch(m_start) { case1: SetTimer(1,1000,NULL); SetDlgItemText(IDC_BUTTON_NPJUDGE,"STOP");m_start=0;break;case0:KillTimer(1);SetDlgItemText(IDC_BUTTON_NPJUDGE,"GO");m_start=1;break;}}voidCNodeproperty::OnTimer(UINTnIDEvent)//更新指定节点的信息{ switch(nIDEvent) {case1:for(int;j=0;j<=1;j++){if(OnSelchangeComboNpnodeselect()==CNode::nodeadd[j]){//if(CNode::content[j]==1){ //m_NpNetnum=CNode::netnum[j]; m_NpNodeadd=CNode::nodeadd[j]; m_Npnodetype=CNode::sentype[j]; m_NpNmadd=CNode::nodemac[j]; m_NpFnmadd=CNode::fnodemac[j]; m_NPsentype=CNode::nodetype[j]; m_NpLight=CNode::senlight[j]; m_NpTemper=CNode::sentemper[j]; if(CNode::ZTstate[j]=="00"){m_NPztstate="关";}else{m_NPztstate="开";}UpdateData(false);//更新,将关联变量的值更新到控件上}}}}}3.6数据库实现本软件采用VisualC++与Access的ADO连接,对数据库中各表进行插入数据的操作,利用MFC中的列表控件的各种方法将数据库中各表的内容直观的展现在用户眼前。ADO数据库开发的一般流程是首先初始化COM库,引入ADO库定义文件;然后用Connection对象连接数据库;再利用建立好的连接,通过Connection、Command对象执行SQL语句,或利用Recordset对象取得结果记录集进行查询、处理;最后使用完毕后关闭连接释放对象[20]。(1)数据库表设计数据库建立的两个数据库表如下:表3.10为历史实测数据表,表3.11为历史控制数据表3.10为历史实测数据表字段名称字段类型时间文本节点地址文本节点Mac地址文本父节点Mac地址文本节点网络类型文本传感器类型文本光照强度文本温度文本继电器状态文本表3.11为历史控制数据表字段名称字段类型时间文本节点地址文本节点Mac地址文本节点网络类型文本传感器类型文本温度最大值文本温度最小值文本光照最大值文本光照最小值文本继电器状态文本(2)数据库数据载入历史实测数据在串口通信协议处插入数据表,在此以对“历史实测数据表”的处理为例阐述此类操作的方法。a.引入ADO类。在StdAfx.h文件中添加如下代码将msado15.dll动态链接库导入到程序中。代码如下:#import"c:\programfiles\commonfiles\system\ado\msado15.dll"\no_namespace\rename("EOF","adoEOF")b.声明一个智能指针,代码如下:_ConnectionPtr m_pConnection;//声明变量,用于数据库_RecordsetPtr m_pRecordset3;c.记录数据到数据库代码如下:m_pConnection.CreateInstance(__uuidof(Connection));//创建数据库实例 try { //打开本地Access库数据库.mdbm_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=数据库.mdb","","",adModeUnknown); } catch(_com_errore) {AfxMessageBox("数据库连接失败,确认数据库数据库.mdb是否在当前路径下!");} m_pRecordset3.CreateInstance(__uuidof(Recordset)); CTimetime;time=CTime::GetCurrentTime(); CStringstrTime; strTime=time.Format("%Y-%m-%d%H:%M:%S");//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,//因为它有时会经常出现一些意想不到的错误。 try {m_pRecordset3->Open("SELECT*FROM历史实测数据", m_pConnection.GetInterfacePtr(), //获取库接库的IDispatch指针 adOpenDynamic, adLockOptimistic, adCmdText); } catch(_com_error*e) {AfxMessageBox(e->ErrorMessage());} longCount=m_pRecordset3->GetRecordCount(); if(Count>=100)//最多100条记录 { //删除记录 try { m_pRecordset3->MoveFirst();//从0开始 m_pRecordset3->Delete(adAffectCurrent);//参数adAffectCurre

温馨提示

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

评论

0/150

提交评论