




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
畢業設計說明書(論文)作者:學號:學院:計算機工程學院專業:通信工程題目:智能環境監控系統設計指導者:(姓名)(專業技術職務)評閱者:(姓名)(專業技術職務)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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二年級數學下冊 三 生活中的大數第6課時 比一比(1)教學設計 北師大版
- 人教部編版(2024)七年級2025年賣油翁教案及反思
- 人教版生物八年級上冊6.1.1《嘗試對生物進行分類》教學設計
- 人教部編版 九年級歷史下冊第10課 《凡爾賽條約》和《九國公約》教學設計
- 人教 版五年級美術下冊《第3課 抽象的雕塑》教學設計
- 人教版歷史八上第22課科學技術與思想文化教學設計2份 (2份打包)
- 專題11 標點符號之問號(教案)-2024-2025學年高考語文一輪復習之語言文
- 九年級英語上冊 Unit 4 I used to be afraid of the dark Section B(1a-1e)教學設計(新版)人教新目標版
- 專題四第1課一、《智能家居》教學設計 2023-2024學年青島版(2018)初中信息技術八年級上冊
- 人教部編九年級上冊歷史第21課《馬克思主義的誕生和國際工人運動的興起》教學設計
- 【上海市靜安區寶山路街道社區養老問題調查報告】
- 公文筐測驗(案例題解示范)
- 外科學骨與關節化膿性感染
- 口腔一般檢查方法口腔一般檢查方法
- 冠狀動脈粥樣硬化性心臟病 (心內科)
- GB/T 4857.10-2005包裝運輸包裝件基本試驗第10部分:正弦變頻振動試驗方法
- GB/T 12-2013圓頭方頸螺栓
- 初中生物人教七年級上冊生物體的結構層次第一節 細胞通過分裂產生新細胞 導學案
- 甘肅省煙花爆竹經營許可實施標準細則
- 釣魚中各種氨基酸誘食劑說明及使用方法
- 【精品課件】藥用高分子材料學
評論
0/150
提交評論