

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 鐵路客運(yùn)安全服務(wù)系統(tǒng)</p><p> ——基于VC++的上位機(jī)控制系統(tǒng)</p><p><b> 摘 要</b></p><p> 本文介紹了本人應(yīng)用VC++6.0和Access2000工具開(kāi)發(fā)《鐵路客運(yùn)安全服務(wù)系統(tǒng)》的過(guò)程,對(duì)開(kāi)發(fā)軟件進(jìn)行了簡(jiǎn)單介紹,遵從軟件開(kāi)發(fā)的一般步驟,涉及到軟件開(kāi)發(fā)前期的系統(tǒng)的需求分析,詳
2、細(xì)設(shè)計(jì)過(guò)程中數(shù)據(jù)庫(kù)的設(shè)計(jì),包括表的設(shè)計(jì)等,著重講述了我在開(kāi)發(fā)過(guò)程中所承擔(dān)的工作,包括上位機(jī)整體的構(gòu)思、設(shè)計(jì)及實(shí)現(xiàn),串口控件、類的使用,以及在VC++中主框架、彈出項(xiàng)和數(shù)據(jù)庫(kù)的設(shè)計(jì),程序模塊的編程思想、代碼實(shí)現(xiàn)等,并總結(jié)了在開(kāi)發(fā)過(guò)程中所遇到的問(wèn)題及其解決方法。</p><p> 關(guān)鍵詞:串口通訊 Access數(shù)據(jù)庫(kù) ODBC CserialPortEx</p><p><b>
3、; ABSTRACT</b></p><p> 目 錄</p><p> 第一章 系統(tǒng)的整體研究</p><p> 1.1 本次畢業(yè)設(shè)計(jì)的意義</p><p> 1.2 設(shè)計(jì)內(nèi)容概述</p><p> 第二章 技術(shù)的考慮和選擇</p><p> 2.1
4、 開(kāi)發(fā)的軟件環(huán)境</p><p> 2.1.1 Visual C++ 6.0</p><p> 2.1.2 Access 2000</p><p> 2.2 開(kāi)發(fā)的硬件環(huán)境</p><p> 2.2.1 RS-232異步串行通訊總線</p><p> 2.2.2 RS-485接口轉(zhuǎn)換器ADS-106<
5、;/p><p> 2.3 通訊方案的確定</p><p> 2.3.1目前流行的開(kāi)發(fā)技術(shù)的比較</p><p> 2.3.2 Mscomm控件的研究</p><p> 2.3.3 CserialPortEx類的分析</p><p> 2.3.4 為什么要選擇CserialPortEx類技術(shù)</p>
6、<p> 第三章 系統(tǒng)分析與設(shè)計(jì)</p><p><b> 3.1問(wèn)題的提出</b></p><p><b> 3.2可行性研究</b></p><p><b> 3.3需求分析</b></p><p> 3.4系統(tǒng)各模塊間的關(guān)系圖</p>
7、<p> 第四章 數(shù)據(jù)庫(kù)的設(shè)計(jì)與實(shí)現(xiàn)</p><p> 4.1 開(kāi)放式數(shù)據(jù)庫(kù)連接(ODBC)技術(shù)</p><p> 4.1.1 開(kāi)放式數(shù)據(jù)庫(kù)連接簡(jiǎn)介</p><p> 4.1.2 MFC對(duì)ODBC的支持</p><p> 4.1.3 在MFC中應(yīng)用ODBC編程</p><p> 4.2 數(shù)據(jù)
8、庫(kù)中表的設(shè)計(jì)</p><p> 4.3 創(chuàng)建并配置數(shù)據(jù)源</p><p> 第五章 程序設(shè)計(jì)與實(shí)現(xiàn)</p><p> 5.1 程序創(chuàng)建與數(shù)據(jù)庫(kù)連接</p><p> 5.2 主窗體的設(shè)計(jì)</p><p> 5.3 數(shù)據(jù)庫(kù)顯示模塊</p><p> 5.4
9、 串口通訊模塊</p><p> 5.4.1 通訊協(xié)議的確定</p><p> 5.4.2 數(shù)據(jù)的接收與入庫(kù)</p><p> 5.4.3 串口設(shè)置</p><p> 5.4.4 點(diǎn)名功能的實(shí)現(xiàn)</p><p> 5.5 信息查詢模塊</p><p> 5
10、.5.1 普通查詢</p><p> 5.5.2 問(wèn)題查詢</p><p> 第六章 遇到的問(wèn)題及解決</p><p><b> 結(jié)論</b></p><p><b> 謝辭</b></p><p><b> 參考文獻(xiàn)</b></
11、p><p><b> 技術(shù)文章翻譯</b></p><p><b> 附錄</b></p><p><b> 前 言</b></p><p> 在通訊技術(shù)飛速發(fā)展的今天,隨著鐵路部門(mén)的列車(chē)提速,車(chē)站人員流動(dòng)量的增大,鐵路客運(yùn)的安全已經(jīng)越來(lái)越受到人們的關(guān)注和重視。針對(duì)這一問(wèn)
12、題,我們?cè)O(shè)計(jì)開(kāi)發(fā)了基于VC++環(huán)境下的鐵路客運(yùn)安全服務(wù)系統(tǒng)。</p><p> 目前,在這方面航空部門(mén)已經(jīng)將互聯(lián)網(wǎng)技術(shù)應(yīng)用到比較高的水平,實(shí)現(xiàn)了在各大機(jī)場(chǎng)間的互動(dòng)聯(lián)系通訊,在乘客登機(jī)前進(jìn)行刷卡登機(jī),將基本資料進(jìn)行記錄,然后通過(guò)乘客登機(jī)前的登機(jī)記錄,實(shí)現(xiàn)對(duì)每一次航班的所有登機(jī)乘客的基本資料的統(tǒng)計(jì),并在各大機(jī)場(chǎng)間進(jìn)行相應(yīng)的通訊聯(lián)系,存儲(chǔ)每位乘客登機(jī)和離機(jī)的時(shí)間、地點(diǎn),從而為出事后的調(diào)查工作提供可靠的依據(jù)、線索。&l
13、t;/p><p> 由于鐵路部門(mén)是一個(gè)每日客流量都很大的大型運(yùn)輸部門(mén),在這方面的管理工作尚不完善,這種比較先進(jìn)的系統(tǒng)在鐵路方面尚未得到廣泛的應(yīng)用,所以這次我們所做的“鐵路客運(yùn)安全服務(wù)系統(tǒng)”就是本著在鐵路客運(yùn)站點(diǎn)上實(shí)現(xiàn)這種機(jī)制的原則,來(lái)進(jìn)行開(kāi)發(fā)設(shè)計(jì)的,用以解決鐵路站點(diǎn)出入人員流動(dòng)量大、人員情況復(fù)雜、難于管理的問(wèn)題,完善了鐵路安全保障系統(tǒng),保證鐵路旅客乘車(chē)的安全。所以,要在鐵路實(shí)現(xiàn)這樣一個(gè)安全機(jī)制,不僅有很強(qiáng)的實(shí)用價(jià)值
14、,而且有廣闊的應(yīng)用前景,其意義也是非常之深遠(yuǎn)的。</p><p> 本系統(tǒng)預(yù)定由一臺(tái)上位機(jī)和若干臺(tái)下位機(jī)組成,各下位機(jī)用來(lái)模仿全國(guó)鐵路的各個(gè)站點(diǎn),上位機(jī)運(yùn)用點(diǎn)名式方法接收、管理、存儲(chǔ)各下位機(jī)所記錄的信息,將之匯總存入后臺(tái)數(shù)據(jù)庫(kù),并可以針對(duì)庫(kù)中的記錄進(jìn)行各種查詢操作。我們小組由6人組成,其中5人各負(fù)責(zé)一臺(tái)下位機(jī)的實(shí)現(xiàn),我則在課題中主要負(fù)責(zé)上位機(jī)的開(kāi)發(fā)任務(wù),并參與了系統(tǒng)最后的調(diào)試工作。對(duì)于上位機(jī)的開(kāi)發(fā),主要包括三個(gè)
15、方面的內(nèi)容:串口通訊,前臺(tái)界面和后臺(tái)數(shù)據(jù)庫(kù)。</p><p> 現(xiàn)在,鐵路客運(yùn)安全服務(wù)系統(tǒng)作為較新的管理方法,已經(jīng)逐漸被社會(huì)大眾所認(rèn)同,并開(kāi)始應(yīng)用于相關(guān)的領(lǐng)域中,它有著很大的發(fā)展前景。</p><p> 首先,從社會(huì)角度講,實(shí)現(xiàn)這樣一個(gè)安全機(jī)制對(duì)整個(gè)社會(huì)的安全穩(wěn)定是有很大幫助的,一旦列車(chē)出現(xiàn)故障、事故,鐵路部門(mén)可以及時(shí)通過(guò)該機(jī)制輔助對(duì)事故發(fā)生的原因進(jìn)行調(diào)查,以盡快找出原因,做好防范措施
16、。</p><p> 其次,從經(jīng)濟(jì)角度講,建立這樣一套安全機(jī)制對(duì)鐵路企業(yè)自身的長(zhǎng)遠(yuǎn)發(fā)展也會(huì)有不小的益處。它能夠使鐵路部門(mén)在事故發(fā)生后的調(diào)查工作中,節(jié)省人、財(cái)、物力,從而節(jié)省開(kāi)支。</p><p> 當(dāng)然我們也應(yīng)看到,現(xiàn)在的鐵路客運(yùn)安全服務(wù)系統(tǒng)仍面臨著幾個(gè)重大課題:首先,安全性問(wèn)題?,F(xiàn)在的安全系統(tǒng)的安全性并不是很完善。一些高級(jí)黑客可以很輕松地進(jìn)入系統(tǒng),破壞系統(tǒng)數(shù)據(jù)。對(duì)于這類問(wèn)題,目前的系
17、統(tǒng)很少有完善的安全性保證。其次,我們所做的系統(tǒng)只是應(yīng)用于局域網(wǎng),通過(guò)計(jì)算機(jī)的串口進(jìn)行通訊傳輸?shù)?,未?lái)是網(wǎng)絡(luò)的時(shí)代,將來(lái)的發(fā)展趨勢(shì)是:在任何可以連接到Internet的地方,都可以運(yùn)行該系統(tǒng),如何將安全系統(tǒng)搬到Internet上,這也將是一個(gè)重要問(wèn)題。總之,鐵路客運(yùn)安全服務(wù)系統(tǒng)在將來(lái)將會(huì)越來(lái)越快地發(fā)展和普及,其前景將會(huì)是一片光明。</p><p> 通過(guò)本次畢業(yè)設(shè)計(jì),在導(dǎo)師王老師的耐心指導(dǎo)和同學(xué)們的熱心幫助下,使
18、我對(duì)VC++及數(shù)據(jù)庫(kù)技術(shù)有了更加深入的理解和認(rèn)識(shí),同時(shí)也為團(tuán)隊(duì)合作開(kāi)發(fā)規(guī)模稍大項(xiàng)目和綜合應(yīng)用本專業(yè)所學(xué)課程知識(shí)創(chuàng)造了實(shí)踐機(jī)會(huì),使我們通過(guò)參加小組團(tuán)隊(duì)的開(kāi)發(fā)實(shí)踐,理解真正的開(kāi)發(fā)團(tuán)隊(duì)的工作程序,為今后走向社會(huì)打下堅(jiān)實(shí)的基礎(chǔ)。下面,讓我們來(lái)具體介紹和分析這種服務(wù)系統(tǒng)。</p><p> 第一章 系統(tǒng)的整體研究</p><p> 1.1本次畢業(yè)設(shè)計(jì)的研究意義</p><p&
19、gt; 隨著時(shí)代的飛速發(fā)展, 社會(huì)的不斷進(jìn)步,先進(jìn)的科學(xué)技術(shù)不斷應(yīng)用于各大行業(yè)中。在鐵路部門(mén),現(xiàn)行的乘客安全管理制度已逐漸不能適應(yīng)當(dāng)前的時(shí)代變化,需要更新和完善。對(duì)于這方面的應(yīng)用,航空部門(mén)已經(jīng)做到了比較高的水平,實(shí)現(xiàn)了乘客登機(jī)前刷卡,將每一班飛機(jī)上乘客的基本資料進(jìn)行存儲(chǔ),記錄每位乘客登機(jī)和離機(jī)的時(shí)間、地點(diǎn)等資料,并通過(guò)互聯(lián)網(wǎng)進(jìn)行記錄的傳輸,從而為出事后的調(diào)查工作提供可靠的依據(jù)、線索。</p><p> 鐵路,
20、是當(dāng)今全國(guó)重要的交通工具之一。它自出現(xiàn)以來(lái)就一直占據(jù)交通領(lǐng)域的重要地位,是全國(guó)經(jīng)濟(jì)運(yùn)行的命脈;雖然現(xiàn)在航空、海運(yùn)、河運(yùn)、公路等其他交通工具蓬勃發(fā)展起來(lái),但鐵路的重要地位依然沒(méi)有被動(dòng)搖。像這樣一個(gè)重要的部門(mén),它的健康成長(zhǎng)是極其重要的。所以,針對(duì)鐵路現(xiàn)行的安全管理制度的改進(jìn)是事在必行的。</p><p> 由于鐵路部門(mén)是一個(gè)每日客流量都很大的大型運(yùn)輸部門(mén),在這方面的管理工作尚不完善,類似航空部門(mén)那種比較先進(jìn)的系統(tǒng)在
21、鐵路方面尚未得到廣泛的應(yīng)用,所以這次我們所做的“鐵路客運(yùn)安全服務(wù)系統(tǒng)”就是本著在鐵路客運(yùn)站點(diǎn)上實(shí)現(xiàn)這種機(jī)制的原則,來(lái)進(jìn)行開(kāi)發(fā)設(shè)計(jì)的,用以解決鐵路站點(diǎn)出入人員流動(dòng)量大、人員情況復(fù)雜、難于管理等問(wèn)題,從而完善鐵路安全保障系統(tǒng),保證鐵路旅客乘車(chē)的安全。要在鐵路實(shí)現(xiàn)這樣一個(gè)安全機(jī)制,不僅有很強(qiáng)的實(shí)用價(jià)值,而且有廣闊的應(yīng)用前景,其意義也是非常之深遠(yuǎn)的。</p><p> 1.2 設(shè)計(jì)內(nèi)容概述</p><
22、;p> 在本次設(shè)計(jì)中,我主要負(fù)責(zé)整個(gè)系統(tǒng)上位機(jī)的整體設(shè)計(jì)工作,主要是3個(gè)方面內(nèi)容:串口通訊,主界面設(shè)計(jì)和后臺(tái)數(shù)據(jù)庫(kù)建立。系統(tǒng)的功能模塊主要包括:串口通信模塊、數(shù)據(jù)庫(kù)處理模塊、控制模塊、顯示模塊和查詢模塊共5個(gè)。其中串口通信模塊包含:串口數(shù)據(jù)的接收入庫(kù)與顯示、串口設(shè)置、循環(huán)點(diǎn)名、單一點(diǎn)名;查詢模塊包括:普通查詢、問(wèn)題查詢。</p><p> 第二章 技術(shù)的考慮和選擇</p><p&g
23、t; 2.1 開(kāi)發(fā)的軟件環(huán)境</p><p> 在本次設(shè)計(jì)中我們使用了Windows ME的操作系統(tǒng),應(yīng)用Visual C++ 6.0和Access 2000,下面將對(duì)這兩種軟件進(jìn)行簡(jiǎn)單的介紹,并對(duì)本人在開(kāi)發(fā)過(guò)程中所用到的功能進(jìn)行簡(jiǎn)單分析。</p><p> 2.1.1 Visual C++ 6.0</p><p> Visual C++ 6.0是一種高級(jí)編
24、程工具軟件,它有功能強(qiáng)大的集成開(kāi)發(fā)環(huán)境,并提供功能強(qiáng)大的向?qū)Чぞ撸∕FC AppWizard、ClassWizard、MFC ActiveX ControlWizard等)來(lái)簡(jiǎn)化Win32應(yīng)用程序的開(kāi)發(fā),用它可以方便地進(jìn)行項(xiàng)目的管理、編寫(xiě)C++源程序、編譯、改錯(cuò)。更重要的是,Visual C++提供了一套Microsoft Foundation Classes(簡(jiǎn)稱為MFC)的程序類庫(kù)(classes library),現(xiàn)在這套由微軟開(kāi)
25、發(fā)的程序類庫(kù)已經(jīng)成為設(shè)計(jì)窗口應(yīng)用程序的準(zhǔn)工業(yè)標(biāo)準(zhǔn)。</p><p> 其向?qū)в糜趲椭筛鞣N不同類型應(yīng)用程序的基本框架,并可以使用Class Wizard 來(lái)創(chuàng)建新類(class),定義消息處理函數(shù)(message handler),覆蓋虛擬函數(shù)(virtual function)、從對(duì)話框(dialog box)、表單視圖(form view)、或者記錄視圖(record view)的控件中獲取數(shù)據(jù)并驗(yàn)證數(shù)據(jù)
26、的合法性,添加屬性(property)、事件(event)和方法(method)到自動(dòng)化對(duì)象(Automation object)中。此外還可以使用WizardBar來(lái)定義消息處理函數(shù)、覆蓋虛擬函數(shù)并瀏覽實(shí)現(xiàn)文件(.cpp)。</p><p> 此外,Visual C++ 6.0提供最快的集成數(shù)據(jù)庫(kù)訪問(wèn),向?qū)Чぞ咧С諨AO和ODBC類,允許用戶建立強(qiáng)有力的數(shù)據(jù)庫(kù)應(yīng)用程序??梢允褂肙DBC類和高性能的32位ODB
27、C驅(qū)動(dòng)程序來(lái)訪問(wèn)各種數(shù)據(jù)庫(kù)管理系統(tǒng);可以使用DAO(數(shù)據(jù)訪問(wèn)對(duì)象)類通過(guò)編程語(yǔ)言來(lái)訪問(wèn)和操縱數(shù)據(jù)庫(kù)中的數(shù)據(jù)并管理數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)對(duì)象與結(jié)構(gòu)。</p><p> 2.1.2 Access 2000</p><p> Access是Office辦公系列軟件中自帶的一個(gè)數(shù)據(jù)庫(kù)管理軟件,它提供了一個(gè)功能強(qiáng)大、使用方便靈活的信息管理環(huán)境,是一個(gè)受到一致推崇的桌面數(shù)據(jù)庫(kù)系統(tǒng)。它在用戶和數(shù)據(jù)庫(kù)之間架起
28、了一座橋梁,使得用戶對(duì)數(shù)據(jù)的存取、分類和查看更為容易。</p><p> 我用Access 2000建立的數(shù)據(jù)庫(kù),建立了表、并定義了主鍵。使用ODBC動(dòng)態(tài)連接Access數(shù)據(jù)庫(kù),并運(yùn)用VC++代碼來(lái)實(shí)現(xiàn)對(duì)庫(kù)內(nèi)記錄的查詢功能。</p><p> 2.2 開(kāi)發(fā)的硬件環(huán)境</p><p> 在本次設(shè)計(jì)中,我們的項(xiàng)目涉及到串口通訊的問(wèn)題,軟件方面應(yīng)用VC++來(lái)實(shí)現(xiàn),而
29、硬件方面則應(yīng)用到RS-485接口轉(zhuǎn)換器ADS-106來(lái)實(shí)現(xiàn)通訊目標(biāo)。</p><p> 2.2.1 RS-232-C異步串行通訊總線</p><p> RS-232-C是使用得最早、最多的一種異步串行通信總線。它由美國(guó)電子工業(yè)協(xié)會(huì)于1962年公布,它主要用來(lái)定義計(jì)算機(jī)系統(tǒng)的一些數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通信設(shè)備(DCE)之間接口的電氣特性。RS-232-C標(biāo)準(zhǔn)總線有25條信號(hào)線,對(duì)其
30、機(jī)械特性并未做嚴(yán)格規(guī)定。在RS-232-C中包括兩個(gè)信道:主信道和次信道,它的信號(hào)分為兩類:一類是DTE與DCE交換的信息:TxD和RxD;另一類是為了正確無(wú)誤地傳輸上述信息而設(shè)計(jì)的聯(lián)絡(luò)信號(hào)。</p><p> 2.2.2 RS-485接口轉(zhuǎn)換器ADS-106</p><p> RS-485接口轉(zhuǎn)換器ADS-106可將RS-232-C串行口的數(shù)據(jù)發(fā)送(TD)和數(shù)據(jù)接收(RD)信號(hào)轉(zhuǎn)換成
31、兩線平衡的半雙工RS-485信號(hào),它是遠(yuǎn)距離控制設(shè)備或點(diǎn)到多點(diǎn)總線通信的最佳選擇,該接口轉(zhuǎn)換裝置,不需要外接交流直流電源,可直接從RS-485 端口內(nèi)的數(shù)據(jù)發(fā)送(TD)信號(hào)、請(qǐng)求發(fā)送(RTS)或數(shù)據(jù)終端準(zhǔn)備好(DTR)獲取電源,而且還加上了發(fā)送數(shù)據(jù)自動(dòng)控制的功能,在發(fā)送接收數(shù)據(jù)時(shí)不需要RTS使能控制。如下圖所示:</p><p> 這是一般應(yīng)用RS-485接口轉(zhuǎn)換器的示意圖,轉(zhuǎn)換器RS-232口端接上位機(jī)中心主
32、站,RS-485口端串行連接各RS-485設(shè)備。但在本設(shè)計(jì)中,接口轉(zhuǎn)換器RS-232口端接上位機(jī)中心主站,而RS-485口端則與其他接口轉(zhuǎn)換器的RS-485口端相連,形成一個(gè)星型連接。</p><p> 2.3 通訊方案的確定</p><p> 在實(shí)驗(yàn)室和工業(yè)應(yīng)用中,串口是常用的計(jì)算機(jī)與外部串行設(shè)備之間的數(shù)據(jù)傳輸通道,由于串行通信方便易行,所以應(yīng)用廣泛。目前,用VC++來(lái)實(shí)現(xiàn)串口的
33、通訊方法有很多種,下面逐個(gè)進(jìn)行簡(jiǎn)單的介紹,重點(diǎn)分析MSComm控件和CserialPortEx類,最后說(shuō)明選擇CserialPortEx類的原因。</p><p> 2.3.1目前流行的幾種開(kāi)發(fā)技術(shù)的比較</p><p> 在Microsoft Windows下開(kāi)發(fā)串口通信程序通常有如下幾種方法:</p><p> 1)利用Windows API通信函數(shù)。&l
34、t;/p><p> 2)利用Windows的讀寫(xiě)端口函數(shù)_inp、_inpw、_inpd、_outp、_outpw、_outpw(Windows95系列下)或開(kāi)發(fā)驅(qū)動(dòng)程序(Windows NT系列下)直接對(duì)串口進(jìn)行操作。</p><p> 3)利用第三方提供或自己編寫(xiě)的通信類。</p><p> 4)使用串口通信組件,如:ActiveX控件MSComm。</
35、p><p> 在以上幾種方法中第一種(即API函數(shù)法)使用面較廣,但由于比較復(fù)雜,使用比較困難。第二種需要了解硬件電路結(jié)構(gòu)原理,深入驅(qū)動(dòng)層次,專業(yè)化程度較高。第三種方法使用面向?qū)ο蠹夹g(shù)封裝Win32 API函數(shù),提供一個(gè)用于串行通信的類,只要理解這種類的幾個(gè)成員函數(shù),就能方便地使用。第四種方法較簡(jiǎn)單,只需要對(duì)串口進(jìn)行簡(jiǎn)單的配置,唯一比較困難的地方在于令人費(fèi)解的VARIANT類。</p><p&g
36、t; 2.3.2 Mscomm控件的研究</p><p> Microsoft Communication Control(簡(jiǎn)稱MSComm)是微軟公司提供的簡(jiǎn)化Windows下串行通信編程的ActiveX控件,它為應(yīng)用程序提供了通過(guò)串行接口收發(fā)數(shù)據(jù)的簡(jiǎn)便方法,在Visual C++、Visual Basic、Delphi等語(yǔ)言中均可以使用。MSComm控件提供兩種處理通信的方式:事件驅(qū)動(dòng)方式和查詢方式。&l
37、t;/p><p> (1)事件驅(qū)動(dòng)方式:事件驅(qū)動(dòng)通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時(shí)需要得到通知,例如,在串口接收緩沖區(qū)中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 線上一個(gè)字符到達(dá)或一個(gè)變化發(fā)生時(shí)。在這些情況下,可以利用 MSComm 控件的 OnComm 事件捕獲并處理這些通訊事件。OnComm 事件還可以檢查和處理
38、通訊錯(cuò)誤。所有通訊事件和通訊錯(cuò)誤的列表,參閱 CommEvent 屬性。在編程過(guò)程中,就可以在OnComm事件處理函數(shù)中加入自己的處理代碼。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時(shí),可靠性高。每個(gè)MSComm 控件對(duì)應(yīng)著一個(gè)串行端口。如果應(yīng)用程序需要訪問(wèn)多個(gè)串行端口,必須使用多個(gè) MSComm 控件</p><p> (2)查詢方式:查詢方式實(shí)質(zhì)上還是事件驅(qū)動(dòng),但在有些情況下,這種方式顯得更為便捷。在程序的每個(gè)關(guān)鍵功能之后
39、,可以通過(guò)檢查 CommEvent 屬性的值來(lái)查詢事件和錯(cuò)誤。如果應(yīng)用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫(xiě)一個(gè)簡(jiǎn)單的電話撥號(hào)程序,則沒(méi)有必要對(duì)每接收一個(gè)字符都產(chǎn)生事件,因?yàn)槲ㄒ坏却邮盏淖址钦{(diào)制解調(diào)器的“確定”響應(yīng)。</p><p> MSComm 控件有很多重要的屬性,但首先必須熟悉幾個(gè)屬性:</p><p> 1)CommPort 設(shè)置并返回通訊端口號(hào)。
40、</p><p> 2)Settings 以字符串的形式設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位。</p><p> 3)PortOpen 設(shè)置并返回通訊端口的狀態(tài)。也可以打開(kāi)和關(guān)閉端口。</p><p> 4)Input 從接收緩沖區(qū)返回和刪除字符。</p><p> 5)Output 向傳輸緩沖區(qū)寫(xiě)一個(gè)字符串。</p>
41、;<p> 下面分別描述: CommPort屬性 設(shè)置并返回通訊端口號(hào),類型為short。語(yǔ)法:object.CommPort[value ] (value 一整型值,說(shuō)明端口號(hào)。) 說(shuō)明: 在設(shè)計(jì)時(shí),value 可以設(shè)置成從 1 到 16 的任何數(shù)(缺省值為 1)。但是如果用 PortOpen 屬性打開(kāi)一個(gè)并不存在的端口時(shí),MSComm 控件會(huì)產(chǎn)生錯(cuò)誤 68(設(shè)備無(wú)效)。注意:必須在打開(kāi)端口
42、之前設(shè)置 CommPort 屬性。</p><p> Settings 屬性 設(shè)置并返回?cái)?shù)據(jù)波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位參數(shù),類型為Cstring。語(yǔ)法:object.Settings[ = value]說(shuō)明:當(dāng)端口打開(kāi)時(shí),如果 value 非法,則 MSComm 控件產(chǎn)生錯(cuò)誤 380(非法屬性值)。Value 由四個(gè)設(shè)置值組成,有如下的格式:"BBBB,P,D,S"BBBB
43、為波特率,P 為奇偶校驗(yàn),D 為數(shù)據(jù)位數(shù),S 為停止位數(shù)。value 的缺省值是:"9600,N,8,1" </p><p> PortOpen 屬性 設(shè)置或返回串口狀態(tài),BOOL類型:值為T(mén)URE時(shí)打開(kāi),值為FALSE時(shí)關(guān)閉。</p><p> Input屬性 從接收緩沖區(qū)讀取數(shù)據(jù),類型為VARIANT。</p><p> Output屬
44、性 向發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù),類型為VARIANT。</p><p> 2.3.3 CserialPortEx類的分析</p><p> 串口通信類CserialPortEx是在Remon Spekreijse設(shè)計(jì)的CserialPort類基礎(chǔ)上設(shè)計(jì)的,并增加了對(duì)二進(jìn)制數(shù)據(jù)傳輸和塊讀寫(xiě)方式的支持和其他功能函數(shù)。CserialPortEx類主要使用異步方式操作串口,但為了能適用于不同的需求,
45、也提供了使用其他方式操作串口的公共成員函數(shù)。</p><p> CserialPortEx類的設(shè)計(jì)目標(biāo)是提供封裝串口通信細(xì)節(jié)、健壯高效的串口通信類,能支持多串口、多線程,并能在所有主流Windows系統(tǒng)下使用。CserialPortEx類的用戶只需熟悉少數(shù)幾個(gè)公共成員函數(shù),就能輕易在自己的程序中加入串口支持。但值得注意的是,CserialPortEx類并不支持串口通信協(xié)議,因?yàn)椴煌瑧?yīng)用場(chǎng)合下可能需要使用不同的協(xié)
46、議,而使用串口所需的基本功能在各種應(yīng)用場(chǎng)合都是將近相同。</p><p> 下面簡(jiǎn)單分析CserialPortEx類的基本功能:</p><p> (1)建立Event:</p><p> 本步驟在串口初始化函數(shù)CserialPortEx::InitPort內(nèi)實(shí)現(xiàn),用異步方式操作串口必須要定義OVERLAPPER結(jié)構(gòu)m_ov,其中的hEvent成員必須自己創(chuàng)建
47、,它通常必須負(fù)責(zé)EV_RXCHAR(有字符到達(dá)串口)和EV_BREAK、EV_CTS、EV_DSR、EV_ERR、EV_RING、EV_RLSD、EV_RXFLAG、EV_TXEMPTY等串口通信狀態(tài)事件;此外CserialPortEx建立了m_hShutdownEvent(關(guān)閉串口,最高優(yōu)先級(jí))和m_hWriteEvent(寫(xiě)串口)事件。關(guān)鍵代碼如下所示:</p><p> if (m_ov.hEvent !
48、= NULL)</p><p> ResetEvent(m_ov.hEvent);</p><p> m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</p><p> if (m_hWriteEvent != NULL)</p><p> ResetEvent(m_hWriteE
49、vent);</p><p> m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</p><p> if (m_hShutdownEvent != NULL)</p><p> ResetEvent(m_hShutdownEvent);</p><p> m_hShutdow
50、nEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</p><p> // initialize the event objects</p><p> m_hEventArray[0] = m_hShutdownEvent;// highest priority</p><p> m_hEventArray[1] =
51、 m_ov.hEvent;</p><p> m_hEventArray[2] = m_hWriteEvent;</p><p><b> (2)打開(kāi)串口:</b></p><p> 本步驟在串口初始化函數(shù)CserialPortEx::InitPort函數(shù)內(nèi)實(shí)現(xiàn)。應(yīng)用異步方式必須指定FILE_FLAG_OVERLAPPED,而文件方式必須
52、OPEN_EXISTING,同時(shí)讀寫(xiě)必須是GENERIC_READ||GENERIC_WRITE。關(guān)鍵代碼如下:</p><p> m_hComm = CreateFile(szPort,//串口名稱字符串,如:COM1</p><p> GENERIC_READ | GENERIC_WRITE,//讀寫(xiě)</p><p> 0,
53、 //以獨(dú)占方式打開(kāi)</p><p> NULL, //未設(shè)置安全屬性</p><p> OPEN_EXISTING, //串口設(shè)備必須設(shè)置此值</p><p> FILE_FLAG_OVERLAPPED,//使用異步I/O</p><p> 0);
54、 //串口設(shè)備該參數(shù)必須設(shè)為0</p><p> (3)設(shè)置串口參數(shù):</p><p> 本步驟仍在CserialPortEx::InitPort函數(shù)內(nèi)實(shí)現(xiàn)。主要對(duì)串口的DCB 結(jié)構(gòu)、超時(shí)時(shí)間和串口狀態(tài)事件進(jìn)行配置。</p><p> (4)創(chuàng)建串口主線程:</p><p> 本步驟中線程創(chuàng)建在CserialPortEX::Start
55、Monitoring內(nèi)實(shí)現(xiàn),線程實(shí)現(xiàn)函數(shù)為:CserialPortEX::CommThread。</p><p> 串口主線程監(jiān)視寫(xiě)(m_hWriteEvent)、關(guān)閉(m_hShutdownEvent)和串口通信狀態(tài)事件(m_ov.hEvent,包括數(shù)據(jù)到達(dá)串口事件),并調(diào)用相應(yīng)函數(shù)處理這些事件。在串口主線程內(nèi)將使用WaitCommEvent檢測(cè)線路狀態(tài),使用WaitForMultipleObjects監(jiān)視上
56、述3類事件。</p><p><b> (5)讀寫(xiě)數(shù)據(jù):</b></p><p> CserialPortEX提供了兩種讀數(shù)據(jù)的方式,隱式調(diào)用的ReceiveChar(默認(rèn)方式)和顯式調(diào)用的ReadBlock。</p><p> ReceiveChar不需用戶調(diào)用,串口主線程在有數(shù)據(jù)到達(dá)串口時(shí)自動(dòng)調(diào)用該函數(shù),它將讀取到的數(shù)據(jù)通過(guò)自定義消息
57、WM_COMM_RXCHAR發(fā)送給窗口m_pOwner,調(diào)用者只需在該窗口內(nèi)處理WM_COMM_RXCHAR消息即可。ReadBlock由用戶顯式調(diào)用,調(diào)用形式如下:</p><p> BYTE* CserialPortEX::ReadBlock(CserialPortEX*Port,int&readLen)</p><p> 當(dāng)調(diào)用ReadBlock時(shí),將屏蔽CommThre
58、ad對(duì)ReceiveChar的調(diào)用。在串口主線程中CserialPortEX使用WriteChar(CserialPortEX*port)成員函數(shù)寫(xiě)串口,此外CserialPortEX提供了兩個(gè)公共函數(shù)作為接口以供調(diào)用寫(xiě)串口,如下所示:</p><p> void CserialPortEX::WriteToPort(BYTE*string,int nLength);</p><p>
59、 void CserialPortEX::WriteToPort(Cstring str);</p><p><b> (6)關(guān)閉串口:</b></p><p> 本步驟在CserialPortEX::StopMonitoring中實(shí)現(xiàn)。</p><p> 2.3.4為什么要選擇CserialPortEx類技術(shù)</p>&l
60、t;p> 在本次畢業(yè)設(shè)計(jì)中,我最終選擇了CserialPortEX類來(lái)進(jìn)行串口通信的設(shè)計(jì)工作,放棄了在開(kāi)始時(shí)決定使用的MSComm 控件。其原因主要是從以下幾個(gè)方面來(lái)考慮的:</p><p> 首先, 從功能方面考慮,MSComm 控件對(duì)付簡(jiǎn)單的任務(wù)完全可以,但當(dāng)我們需要在程序中用多個(gè)串口,而且還要做很多復(fù)雜處理的時(shí)候, MSComm通訊控件就不是那么好用了。 它畢竟是一個(gè)VC++中自帶的控件,在功能方
61、面還是有限的,不如CserialPortEX類的功能強(qiáng)大。</p><p> 其次,從程序健壯性方面考慮,我們?cè)O(shè)計(jì)中的通信傳輸屬性默認(rèn)設(shè)置是“9600,8,1,N”,若應(yīng)用MSComm 控件的話,如果需要對(duì)這一數(shù)據(jù)進(jìn)行變動(dòng),只能到源程序中手動(dòng)修改Settings的參數(shù)值,而CserialPortEX類則提供了BOOL CserialPortEx::InitPort函數(shù)支持動(dòng)態(tài)設(shè)定串口參數(shù),可以隨時(shí)在生成的系統(tǒng)上
62、進(jìn)行更改,這就大大的擴(kuò)展了所開(kāi)發(fā)程序的應(yīng)用范圍。</p><p> 再次,我設(shè)計(jì)的上位機(jī)是基于VC++中的單文檔應(yīng)用程序,而MSComm 控件在基于對(duì)話框的程序中十分好用,但要讓它基于單文檔就不是那么簡(jiǎn)單了,按常規(guī)在對(duì)話框中的方法添加根本行不通,如要應(yīng)用還需做相應(yīng)的更改工作,且與最終實(shí)現(xiàn)的某些功能有沖突。</p><p> 最后,在今后這方面的實(shí)際應(yīng)用中,隨著程序開(kāi)發(fā)的具體要求不同,對(duì)
63、通信要求的功能也就不同。從長(zhǎng)遠(yuǎn)來(lái)看,使用CserialPortEX類比用MSComm 控件更有發(fā)展前途。</p><p> 第三章 系統(tǒng)分析與設(shè)計(jì)</p><p><b> 3.1問(wèn)題的提出</b></p><p> 在科技飛速發(fā)展的今天,鐵路部門(mén)現(xiàn)有的乘車(chē)管理機(jī)制已不能完全適應(yīng)時(shí)代的發(fā)展,存在著出入人員流動(dòng)量大、人員情況復(fù)雜、難于管理等
64、問(wèn)題,所以急需開(kāi)發(fā)一個(gè)新的系統(tǒng),實(shí)現(xiàn)有效的管理。</p><p><b> 3.2可行性研究</b></p><p> 可行性研究是指在當(dāng)前組織內(nèi)外的具體條件下,系統(tǒng)開(kāi)發(fā)工作必須具備資源和條件,看是否滿足系統(tǒng)目標(biāo)的要求。在系統(tǒng)開(kāi)發(fā)過(guò)程中進(jìn)行可行性研究,對(duì)于保證資源的合理使用,避免浪費(fèi)和一些不必要的失敗,都是十分重要的。</p><p>
65、1.目標(biāo)方案的可行性</p><p> 目標(biāo)和方案的可行性是指目標(biāo)是否明確,方案是否切實(shí)可行,是否滿足組織進(jìn)一步發(fā)展的要求。</p><p> 2.技術(shù)方面的可行性</p><p> 技術(shù)方面的可行性就是根據(jù)現(xiàn)有的技術(shù)條件,考慮所提出的要求是否能達(dá)到。關(guān)系到下面幾個(gè)方面:</p><p> 人員和技術(shù)力量的可行性</p>
66、<p><b> 基礎(chǔ)管理的可行性</b></p><p> 組織系統(tǒng)開(kāi)發(fā)方案的可行性</p><p><b> 計(jì)算機(jī)硬件的可行性</b></p><p><b> 計(jì)算機(jī)軟件的可行性</b></p><p> 環(huán)境條件以及運(yùn)行方面的可行性</p&
67、gt;<p> 3.經(jīng)濟(jì)方面的可行性</p><p> 經(jīng)濟(jì)方面的可行性主要是從組織的人力、財(cái)力、物力三方面來(lái)考察系統(tǒng)開(kāi)發(fā)的可行性。</p><p> 我們經(jīng)過(guò)了解和分析,確定本次設(shè)計(jì)的目標(biāo)十分明確,方案切實(shí)可行,且能夠較好的適應(yīng)鐵路現(xiàn)行的情況;目前我們掌握的技術(shù)(VC++6.0高級(jí)編程語(yǔ)言和Access數(shù)據(jù)庫(kù))已經(jīng)能夠?qū)崿F(xiàn)所提出的要求,計(jì)算機(jī)系統(tǒng)的軟、硬件開(kāi)發(fā)環(huán)境也是
68、允許的;從經(jīng)濟(jì)方面看,我們6人小組足以勝任這項(xiàng)開(kāi)發(fā)工作,在財(cái)力、物力方面也沒(méi)有什么問(wèn)題。因此我們開(kāi)發(fā)的這個(gè)“鐵路客運(yùn)安全服務(wù)系統(tǒng)”項(xiàng)目是可行的。</p><p><b> 3.3需求分析</b></p><p> 本次設(shè)計(jì)的具體計(jì)劃為:模擬當(dāng)前鐵路部門(mén)的幾個(gè)站點(diǎn),在每個(gè)站點(diǎn)建立一個(gè)出入站旅客信息登記制度,將每個(gè)站的出入旅客基本資料進(jìn)行存儲(chǔ)入庫(kù),另建立一臺(tái)上位機(jī)對(duì)這
69、些下位機(jī)的記錄進(jìn)行匯集存儲(chǔ),并通過(guò)串口相互連接的方式來(lái)實(shí)現(xiàn)通信傳輸。針對(duì)上位機(jī),要求應(yīng)用點(diǎn)名式的方法,正確接收各臺(tái)下位機(jī)所發(fā)送的數(shù)據(jù),正確記錄后存入后臺(tái)數(shù)據(jù)庫(kù),能夠?qū)?kù)中的記錄進(jìn)行不同條件的查詢,并能夠查找出提前或置后下車(chē)的旅客信息。</p><p> 對(duì)于整個(gè)系統(tǒng),我主要負(fù)責(zé)其中上位機(jī)的整體設(shè)計(jì)及實(shí)現(xiàn)工作。對(duì)于上位機(jī)的設(shè)計(jì),主要是3個(gè)方面內(nèi)容:串口通訊,主界面設(shè)計(jì)和后臺(tái)數(shù)據(jù)庫(kù)建立。系統(tǒng)的功能模塊主要包括:串口
70、通信模塊、數(shù)據(jù)庫(kù)處理模塊、控制模塊、顯示模塊和查詢模塊共5個(gè)。其中串口通信模塊包含:串口數(shù)據(jù)的接收入庫(kù)、串口設(shè)置、循環(huán)點(diǎn)名、單一點(diǎn)名;信息查詢模塊包括:普通查詢、問(wèn)題查詢。</p><p> 串口數(shù)據(jù)的接收入庫(kù)與顯示主要是將從串口緩沖區(qū)讀取的數(shù)據(jù)正確的存入數(shù)據(jù)庫(kù)中相應(yīng)的位置并將當(dāng)前信息顯示在主界面上;串口設(shè)置是可以根據(jù)提供的相關(guān)選項(xiàng)來(lái)進(jìn)行對(duì)串口的波特率、數(shù)據(jù)位、停止位、校驗(yàn)位的設(shè)定;循環(huán)點(diǎn)名和單一點(diǎn)名則是根據(jù)具
71、體的要求對(duì)各下位機(jī)輪流或單一發(fā)送消息,與之建立通訊連接;查詢功能可以分為兩種方法:普通查詢能依據(jù)旅客號(hào)查找出想了解的旅客的基本信息,而問(wèn)題查詢則可通過(guò)該旅客的上下車(chē)地點(diǎn)來(lái)判定他是否是按目的地正常下車(chē)的。</p><p> 3.4系統(tǒng)各模塊間的關(guān)系圖</p><p> 我們?cè)O(shè)計(jì)的安全系統(tǒng)在串口通信方面采用前面提到過(guò)的CserialPortEx類來(lái)進(jìn)行實(shí)現(xiàn),接收串口數(shù)據(jù)時(shí)使用隱式調(diào)用,Cs
72、erialPortEx在串口數(shù)據(jù)到達(dá)時(shí)將數(shù)據(jù)發(fā)送到程序主窗口??刂颇K每隔一段時(shí)間察看一次主窗口串口數(shù)據(jù)接收緩沖區(qū),并對(duì)符合要求的數(shù)據(jù)進(jìn)行處理后通過(guò)數(shù)據(jù)庫(kù)處理模塊存儲(chǔ)到數(shù)據(jù)庫(kù)中,同時(shí)請(qǐng)求顯示模塊更新記錄。</p><p> 在需求分析的基礎(chǔ)上,考慮Visual C++程序編制特點(diǎn),得到如下所示的系統(tǒng)各模塊間關(guān)系圖:(其中寬箭頭表示數(shù)據(jù)流向)</p><p> 第四章 數(shù)據(jù)庫(kù)的設(shè)計(jì)與實(shí)現(xiàn)
73、</p><p> 4.1 開(kāi)放式數(shù)據(jù)庫(kù)連接(ODBC)技術(shù)</p><p> 開(kāi)放式數(shù)據(jù)庫(kù)連接ODBC為各種類型的數(shù)據(jù)庫(kù)管理系統(tǒng)提供了統(tǒng)一的使用 SQL語(yǔ)言的程序設(shè)計(jì)接口,本次設(shè)計(jì)的系統(tǒng)就是使用ODBC接口將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中的。</p><p> 4.1.1 開(kāi)放式數(shù)據(jù)庫(kù)連接簡(jiǎn)介</p><p> ODBC(Open Data
74、Base Connectivity),即開(kāi)放式數(shù)據(jù)庫(kù)連接,是基于SQL(結(jié)構(gòu)化查詢語(yǔ)言)而設(shè)計(jì)的,它提供了一組對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的標(biāo)準(zhǔn)API(應(yīng)用程序編程接口)。一個(gè)基于ODBC的應(yīng)用程序?qū)?shù)據(jù)庫(kù)的操作不依賴任何DBMS,所有數(shù)據(jù)庫(kù)的操作由對(duì)應(yīng)的DBMS的ODBC驅(qū)動(dòng)程序完成。在默認(rèn)情況下,VC6.0只會(huì)安裝SQL Server、Access、FoxPro和dBase的驅(qū)動(dòng)程序。</p><p> 由于ODBC通過(guò)使
75、用驅(qū)動(dòng)程序來(lái)提供數(shù)據(jù)庫(kù)的獨(dú)立性,因此,對(duì)于不同的數(shù)據(jù)庫(kù)就要求使用不同的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,驅(qū)動(dòng)程序?qū)嶋H上是一個(gè)支持ODBC函數(shù)調(diào)用的模塊,通常就是一個(gè)動(dòng)態(tài)鏈接庫(kù)DLL,應(yīng)用程序就是通過(guò)調(diào)用動(dòng)態(tài)鏈接庫(kù)上的驅(qū)動(dòng)程序所支持的函數(shù)來(lái)操作數(shù)據(jù)庫(kù)的,它讓?xiě)?yīng)用程序的編寫(xiě)者避免了與數(shù)據(jù)源相連的復(fù)雜性。</p><p> 4.1.2 MFC對(duì)ODBC的支持</p><p> MFC的ODBC數(shù)據(jù)庫(kù)類對(duì)較復(fù)
76、雜的ODBC API進(jìn)行了封裝,提供了簡(jiǎn)化的調(diào)用接口,從而大大的方便了數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)發(fā)。MFC的數(shù)據(jù)庫(kù)類包括CDatabase類、CRecordset類、CRecordView類和CFieldExchange類。CDatabase類針對(duì)某個(gè)數(shù)據(jù)庫(kù),負(fù)責(zé)連接數(shù)據(jù)源;CRecordset類針對(duì)數(shù)據(jù)源中的記錄集,負(fù)責(zé)對(duì)記錄的操作;CRecordView類負(fù)責(zé)記錄集的用戶界面;而CFieldExchange類負(fù)責(zé)CRecordset與數(shù)據(jù)源
77、的數(shù)據(jù)交換。</p><p> 1.CDatabase類: </p><p> CDatabase類主要功能是建立與ODBC數(shù)據(jù)源的連接,連接的句柄存放在其數(shù)據(jù)成員m_hdbc中,并提供一個(gè)獲取連接字符串的成員函數(shù)GetConnect??梢詣?chuàng)建一個(gè)CDatabase類的對(duì)象,然后調(diào)用OpenEx成員函數(shù)來(lái)建立與數(shù)據(jù)源的連接(通過(guò)ODBC驅(qū)動(dòng)程序),函數(shù)原型為:</p>&
78、lt;p> Virtual BOOL OpenEx(LPCTSTR,DWORD dwOptions=0);</p><p> 其中,參數(shù)lpszConnectString用于指定一個(gè)ODBC連接字符串,該字符串包含數(shù)據(jù)源名稱和其他選項(xiàng)信息。若該值為NULL,則將彈出一個(gè)數(shù)據(jù)源對(duì)話框提示用戶選擇數(shù)據(jù)源,參數(shù)dwOptions用于指定打開(kāi)的數(shù)據(jù)庫(kù)是否為獨(dú)占方式和只讀方式等選項(xiàng)。</p><
79、;p> 2.CRecordset類: </p><p> CRecordset類代表從數(shù)據(jù)源選擇的一組記錄(記錄集),程序可以選擇數(shù)據(jù)源中的某個(gè)表作為一個(gè)記錄集,也可以通過(guò)對(duì)表的查詢得到記錄集,還可以合并同一數(shù)據(jù)源中多個(gè)表的列到一個(gè)記錄集中。通過(guò)該類可以構(gòu)造一個(gè)記錄集,可以打開(kāi)一個(gè)記錄集,可以對(duì)記錄集中的記錄進(jìn)行滾動(dòng)、修改、增加和刪除等操作。CRecordset類與數(shù)據(jù)源記錄的交換是利用記錄字段交換RF
80、X機(jī)制。</p><p> 從數(shù)據(jù)庫(kù)中導(dǎo)出的記錄集有兩種類型:快照(Snapshot)和動(dòng)態(tài)集(Dynaset)??煺帐且淮涡缘貜臄?shù)據(jù)庫(kù)中下載整個(gè)記錄集內(nèi)容,由固定成員組成一個(gè)靜態(tài)集合。動(dòng)態(tài)集是創(chuàng)建指向所請(qǐng)求的每個(gè)記錄的實(shí)際指針,當(dāng)連接的數(shù)據(jù)庫(kù)是共享方式時(shí),動(dòng)態(tài)集的記錄內(nèi)容將動(dòng)態(tài)顯示你和其他應(yīng)用程序所做的修改,因此其記錄集內(nèi)容不是一次性給定的,而是動(dòng)態(tài)變化的。默認(rèn)的記錄集類型是快照。</p>&l
81、t;p> CRecordset類主要的成員函數(shù):</p><p> (1)記錄瀏覽操作函數(shù):包括Move、MoveFirst、MoveLast、MoveNext、MovePrev和SetAbsolutePosition六個(gè)函數(shù)。Move函數(shù)將光標(biāo)從當(dāng)前位置往前或往后相對(duì)移動(dòng)若干個(gè)記錄,移動(dòng)的記錄數(shù)由參數(shù)指定,正值往前移(尾部方向),負(fù)值往后移(頭部方向)。SetAbsolutePosition函數(shù)將當(dāng)前
82、記錄移到由參數(shù)指定的記錄號(hào)上。其他四個(gè)函數(shù)分別將光標(biāo)移到記錄集中的第一個(gè)記錄、最后一個(gè)記錄、下一個(gè)記錄和前一個(gè)記錄。</p><p> (2)記錄更新操作函數(shù):包括AddNew、Delete、Edit、Update、CancelUpate和Requery六個(gè)成員函數(shù)。AddNew函數(shù)用于添加新記錄,Delete函數(shù)用于刪除當(dāng)前記錄,Edit函數(shù)用于修改當(dāng)前記錄各字段數(shù)據(jù)的值。Update函數(shù)用于完成前三個(gè)函數(shù)所
83、做的修改在數(shù)據(jù)源上的最后保存,CancelUpdate函數(shù)取消任何由Edit和AddNew操作導(dǎo)致的待處理的更新。Requery函數(shù)用于重新執(zhí)行對(duì)記錄集的查詢,更新所選記錄。通過(guò)給成員數(shù)據(jù)m_strFilter和m_strSort賦新值,然后調(diào)用Requery函數(shù),可實(shí)現(xiàn)對(duì)記錄的篩選和排序。</p><p> (3)構(gòu)造函數(shù):構(gòu)造函數(shù)CRecordset用于創(chuàng)建一個(gè)記錄集對(duì)象,并把一個(gè)CDatabase對(duì)象的指
84、針作為參數(shù)傳遞給CRecordset函數(shù),以便獲得已由CDatabase對(duì)象建立起來(lái)的與數(shù)據(jù)源的連接。如果傳給它一個(gè)NULl值,則CDatabase對(duì)象被自動(dòng)創(chuàng)建,并自動(dòng)連接到數(shù)據(jù)源。CRecordset或其派生類對(duì)象通過(guò)一個(gè)虛函數(shù)GetDefaultConnect獲得默認(rèn)的連接字符串。必須在CRecordset派生類中定義該構(gòu)造函數(shù)的內(nèi)容。</p><p> (4)記錄字段數(shù)據(jù)交換函數(shù):包括DoFieldEx
85、change和DoBulkFieldExchange兩個(gè)函數(shù),前者用于一般情況(少量記錄行)的字段數(shù)據(jù)交換,后者用于大量記錄行時(shí)的字段數(shù)據(jù)交換。記錄字段數(shù)據(jù)交換是指在記錄集上字段數(shù)據(jù)成員與數(shù)據(jù)源上當(dāng)前記錄對(duì)應(yīng)列之間自動(dòng)交換數(shù)據(jù)。</p><p> (5)其他重要的成員函數(shù):GetDefaultSQL函數(shù)用于獲得默認(rèn)的SQL語(yǔ)句。CanUpdate函數(shù)用于確認(rèn)記錄集是否可以更新。GetRecordCount函數(shù)用
86、于獲取記錄集中的記錄個(gè)數(shù)。IsDeleted函數(shù)用于確認(rèn)當(dāng)前記錄是否被打上刪除標(biāo)記。IsBOF和IsEOF函數(shù)分別用于確認(rèn)記錄指針是否位于第一個(gè)記錄之前或最后一個(gè)記錄之后。GetFieldValue函數(shù)用于獲取當(dāng)前記錄中指定字段的值。</p><p> 3.CRecordView類: </p><p> CRecordView類稱之為記錄視圖,是在控件中顯示數(shù)據(jù)庫(kù)記錄的視圖。該視圖是直
87、接與一個(gè)記錄集對(duì)象相連接的對(duì)話視圖,從一個(gè)對(duì)話模板資源創(chuàng)建,在對(duì)話模板控件中顯示記錄集對(duì)象的字段數(shù)據(jù)。記錄視圖對(duì)象利用對(duì)話數(shù)據(jù)交換DDX機(jī)制和記錄字段交換RFX機(jī)制自動(dòng)實(shí)現(xiàn)窗體的控件與記錄集的字段之間的數(shù)據(jù)移動(dòng)。CRecordset也提供了移動(dòng)記錄(移動(dòng)到第一個(gè)、下一個(gè)、前一個(gè)和最后一個(gè))的默認(rèn)實(shí)現(xiàn),以及在視圖中根據(jù)當(dāng)前記錄更新用戶界面的默認(rèn)實(shí)現(xiàn)。用AppWizard生成數(shù)據(jù)庫(kù)應(yīng)用程序框架時(shí),AppWizard自動(dòng)生成一個(gè)“記錄”菜單,
88、下面帶有上述的移動(dòng)記錄的四個(gè)菜單項(xiàng),并在工具欄上生成相應(yīng)的四個(gè)工具按鈕。CRecordsetView跟蹤用戶在記錄集中的定位情況,以便記錄視圖能更新用戶界面。</p><p> CRecordView類是從CFormView類派生而來(lái)的,CFormView與一般CView派生類的區(qū)別是在應(yīng)用程序中會(huì)有一個(gè)對(duì)話框資源與該視圖對(duì)應(yīng),在程序運(yùn)行時(shí),該對(duì)話框顯示在當(dāng)前視圖中。CRecordView類從基類繼承的成員函數(shù)
89、中最重要的是對(duì)話數(shù)據(jù)交換函數(shù)DoDataExchange和數(shù)據(jù)更新函數(shù)UpdateData,前者用于實(shí)現(xiàn)記錄集的字段與對(duì)話框的控件之間進(jìn)行數(shù)據(jù)交換,后者用于更新對(duì)話框中控件的數(shù)據(jù)。</p><p> CRecordView類的特有成員函數(shù)為:</p><p> (1)OnGetRecordset函數(shù):</p><p> 調(diào)用OnGetRecordset函數(shù)以獲
90、得指向CRecordset派生類對(duì)象的指針。ClassWizard已為你重載了該函數(shù),如果必要的話,ClassWizard將創(chuàng)建記錄對(duì)象。</p><p> (2)OnMove函數(shù):</p><p> 如果當(dāng)前記錄已改變,OnMove函數(shù)更新對(duì)當(dāng)前記錄所做的修改,移動(dòng)當(dāng)前記錄到指定的記錄上(下一個(gè)、前一個(gè)、第一個(gè)或最后一個(gè)),顯示新記錄的字段內(nèi)容。</p><p&g
91、t; (3)IsOnFirstRecord和IsOnLastRecord函數(shù):</p><p> 這兩個(gè)函數(shù)分別用于確定當(dāng)前記錄是否位于第一個(gè)記錄和最后一個(gè)記錄,這在進(jìn)行用戶界面更新時(shí)很有用。</p><p> 4.CFieldExchange類: </p><p> 支持記錄字段數(shù)據(jù)交換(RFX),即記錄集字段數(shù)據(jù)成員與相應(yīng)的數(shù)據(jù)庫(kù)表的字段之間的數(shù)據(jù)交換。
92、該類的功能與CdataExchange類的對(duì)話框數(shù)據(jù)交換功能類似。</p><p> 4.1.3 在MFC中應(yīng)用ODBC編程</p><p> 在VC++中編寫(xiě)一個(gè)簡(jiǎn)單地利用ODBC管理數(shù)據(jù)庫(kù)的應(yīng)用程序,通常需要完成如下一些步驟(后臺(tái)數(shù)據(jù)庫(kù)使用 Access):</p><p> 1.用Access創(chuàng)建數(shù)據(jù)庫(kù)(并在數(shù)據(jù)庫(kù)內(nèi)至少創(chuàng)建一個(gè)表),作為數(shù)據(jù)源。<
93、;/p><p> 2.在Windows中配置ODBC數(shù)據(jù)源。</p><p> 3.用VC++中的向?qū)ppWizard創(chuàng)建基本的數(shù)據(jù)庫(kù)應(yīng)用程序。</p><p> 4.向基本數(shù)據(jù)庫(kù)添加一些代碼來(lái)實(shí)現(xiàn)一些AppWizard不能支持的功能,如刪除、添加等功能,并創(chuàng)建數(shù)據(jù)庫(kù)顯示。</p><p> 下面依據(jù)上面的步驟來(lái)逐步實(shí)現(xiàn)數(shù)據(jù)庫(kù)的設(shè)計(jì)與實(shí)
94、現(xiàn)。</p><p> 4.2 數(shù)據(jù)庫(kù)中表的設(shè)計(jì)</p><p> 要建立數(shù)據(jù)庫(kù)應(yīng)用程序,必須先創(chuàng)建數(shù)據(jù)庫(kù)并配置數(shù)據(jù)源。在本次設(shè)計(jì)中,我們運(yùn)用Access來(lái)建立數(shù)據(jù)庫(kù),庫(kù)名為:train_station,并在庫(kù)中使用設(shè)計(jì)器創(chuàng)建表建立了一個(gè)名為“旅客信息”的表,如下圖所示:</p><p> 圖4.1 train_station數(shù)據(jù)庫(kù)</p>&
95、lt;p> 圖4.2 旅客信息表設(shè)計(jì)視圖</p><p> 上表的概念結(jié)構(gòu)設(shè)計(jì)是在需求分析的基礎(chǔ)上進(jìn)行的,將“旅客”定為實(shí)體,它的實(shí)體E-R圖為:</p><p> 圖4.3 旅客實(shí)體E-R圖</p><p> 在“旅客信息”表中, 共設(shè)置了十個(gè)字段的信息,分別是:</p><p> ID字段數(shù)據(jù)類型為自動(dòng)編號(hào),設(shè)為主鍵;&l
96、t;/p><p> 旅客號(hào)字段數(shù)據(jù)類型為文本,并限定字段大小為16位,用于標(biāo)識(shí)旅客在數(shù)據(jù)庫(kù)中的唯一性,便于查找。該數(shù)據(jù)的前四位表示該名旅客上車(chē)站的編號(hào),第5-8位表示年份,最后的8位表示從該站上車(chē)旅客的編號(hào)。例如:若標(biāo)識(shí)北京站的編號(hào)為0001,則“0001200400000001”就表示2004年從北京站上車(chē)的第一名旅客;</p><p> 姓名字段數(shù)據(jù)類型為文本,并限定字段大小為8位,用
97、于標(biāo)識(shí)旅客的姓名信息;</p><p> 身份證號(hào)字段數(shù)據(jù)類型為文本,并限定字段大小為18位,用于標(biāo)識(shí)旅客的身份證信息;</p><p> 車(chē)次字段數(shù)據(jù)類型為文本,并限定字段大小為4位,用于標(biāo)識(shí)旅客乘座列車(chē)的編號(hào)信息;</p><p> 檢票時(shí)間字段數(shù)據(jù)類型為日期/時(shí)間,并設(shè)置數(shù)據(jù)格式為常規(guī)日期,用于保存旅客進(jìn)站時(shí)的時(shí)間;</p><p&g
98、t; 上車(chē)站字段數(shù)據(jù)類型為文本,并限定字段大小為8位,用于標(biāo)記旅客入站的站名; </p><p> 目的站字段數(shù)據(jù)類型為文本,并限定字段大小為8位,用于標(biāo)記旅客出站的站名;</p><p> 出站時(shí)間字段數(shù)據(jù)類型為日期/時(shí)間,并設(shè)置數(shù)據(jù)格式為常規(guī)日期,用于保存旅客出站時(shí)的時(shí)間;</p><p> 下車(chē)站字段數(shù)據(jù)類型為文本,并限定字段大小為8位,用于標(biāo)記旅客
99、實(shí)際出站的站名。</p><p> 另外,該表規(guī)定旅客號(hào)和身份證號(hào)的索引是“有(無(wú)重復(fù))”,即在庫(kù)中最多出現(xiàn)一次,保證唯一性。具體情況見(jiàn)下表:</p><p> 4.3 創(chuàng)建并配置數(shù)據(jù)源 </p><p> 首先,打開(kāi)控制面板,雙擊圖標(biāo),在用戶DSN選項(xiàng)卡下單擊“添加”按鈕,在“創(chuàng)建新數(shù)據(jù)源”對(duì)話框中從驅(qū)動(dòng)程序列表中選擇“Driver do Microsof
100、t Access(*.mdb)”選項(xiàng),如下圖所示;然后單擊“完成”按鈕。</p><p> 圖4.4 打開(kāi)數(shù)據(jù)源</p><p> 圖4.5 創(chuàng)建新數(shù)據(jù)源</p><p> 然后,在“ODBC Microsoft Access 安裝”對(duì)話框中填入數(shù)據(jù)源名“train_station”和說(shuō)明信息,并單擊“選擇”按鈕,在“選擇數(shù)據(jù)庫(kù)”對(duì)話框中選中“train_st
101、ation.mdb”數(shù)據(jù)庫(kù),最后連續(xù)單擊“確定”完成數(shù)據(jù)源配置。</p><p> 圖4.6 ODBC Microsoft Access安裝</p><p> 圖4.7 選擇數(shù)據(jù)源</p><p> 第五章 程序設(shè)計(jì)與實(shí)現(xiàn)</p><p> 5.1 程序的創(chuàng)建與數(shù)據(jù)庫(kù)連接</p><p> 在本設(shè)計(jì)中,我們使
102、用VC++ 6.0來(lái)進(jìn)行程序的實(shí)現(xiàn)。首先打開(kāi)“File/New”菜單,選中“Project”選項(xiàng)卡,選擇“MFC AppWizard(exe)”選項(xiàng),填入工程名“鐵路客運(yùn)安全服務(wù)系統(tǒng)”。</p><p> 在AppWizard第一步中應(yīng)用程序類型指定為單文檔,單擊“Next”按鈕進(jìn)入下一步;在AppWizard第二步中選擇Database View Without File Support,單擊“Data so
103、urce”按鈕,在Database Options對(duì)話框中選擇train_station數(shù)據(jù)源,并選中Dynast選項(xiàng)。在選擇了數(shù)據(jù)源之后,AppWizard將提示選擇一個(gè)表,即選擇本數(shù)據(jù)庫(kù)中“ 旅客信息”表,如下圖所示。</p><p> 圖5.1 數(shù)據(jù)源的選擇</p><p> 5.2 主窗體的設(shè)計(jì)</p><p> 本次設(shè)計(jì)的主窗體設(shè)計(jì)圖如下所示,它除
104、了提供各種功能和快捷按鈕供管理員選擇外,還是系統(tǒng)數(shù)據(jù)庫(kù)顯示模塊和查詢模塊的主界面。主窗體菜單欄上的功能主要包括:</p><p> 圖5.2 主窗體設(shè)計(jì)圖</p><p> (1)命令:執(zhí)行打開(kāi)和關(guān)閉串口監(jiān)聽(tīng)功能的操作,并可以對(duì)串口通訊的數(shù)據(jù)位、停止位、校驗(yàn)位、傳輸波特率和使用的端口號(hào)進(jìn)行設(shè)置;</p><p> (2)循環(huán)點(diǎn)名:包括上車(chē)循環(huán)點(diǎn)名和下車(chē)循環(huán)點(diǎn)名
105、,執(zhí)行對(duì)各下位機(jī)的循環(huán)操作;</p><p> (3)進(jìn)站點(diǎn)名:包含模擬的5個(gè)站點(diǎn),可以對(duì)其中任意站點(diǎn)進(jìn)行上車(chē)信息的點(diǎn)名;</p><p> (4)出站點(diǎn)名:包含模擬的5個(gè)站點(diǎn),可以對(duì)其中任意站點(diǎn)進(jìn)行下車(chē)信息的點(diǎn)名;</p><p> (5)記錄:針對(duì)“當(dāng)前旅客信息”欄的操作,通過(guò)看上一記錄和看下一記錄等可以查看庫(kù)中所有記錄,并可以清空數(shù)據(jù)庫(kù)中全部的記錄;&l
106、t;/p><p> (6)滾動(dòng)字幕:使主界面上的“歡迎進(jìn)入鐵路客運(yùn)安全服務(wù)系統(tǒng)!”字幕進(jìn)行不停的滾動(dòng);</p><p> (7)查看:可以顯示和隱藏工具欄和狀態(tài)欄; </p><p> (8)關(guān)于:介紹此軟件的相關(guān)信息等;</p><p> (9)退出:退出該系統(tǒng)。</p><p> 在主界面的左部提供了系統(tǒng)的查
107、詢功能,可以通過(guò)選擇不同的條件來(lái)對(duì)庫(kù)中記錄進(jìn)行不同的查詢;右部則提供了對(duì)當(dāng)前旅客信息的顯示功能,它在默認(rèn)狀態(tài)下顯示數(shù)據(jù)庫(kù)中第一條記錄信息。在主界面的下半部分是對(duì)數(shù)據(jù)庫(kù)中旅客信息記錄的顯示,與當(dāng)前旅客信息欄不同的是它能夠顯示庫(kù)中的全部記錄,并可通過(guò)其下方設(shè)置的控件來(lái)實(shí)現(xiàn)對(duì)其中記錄的上下瀏覽。</p><p> 5.3 數(shù)據(jù)庫(kù)顯示模塊</p><p> 本設(shè)計(jì)的數(shù)據(jù)庫(kù)顯示模塊,主要包括當(dāng)前
108、信息的顯示和歷史數(shù)據(jù)的顯示,下面將一一介紹其實(shí)現(xiàn)過(guò)程。</p><p> 首先添加顯示當(dāng)前旅客信息的一般控件,如下表所示:</p><p> 表5.1 一般顯示控件</p><p> 因?yàn)橥ㄟ^(guò)“當(dāng)前旅客信息”組框查看以往的記錄必須一頁(yè)一頁(yè)的翻動(dòng),比較麻煩。所以本程序提供了“數(shù)據(jù)庫(kù)信息記錄”的顯示功能,即添加歷史數(shù)據(jù)顯示控件,它將數(shù)據(jù)庫(kù)中的記錄數(shù)據(jù)通過(guò)網(wǎng)格的形式
109、顯示給用戶,類似于Access或 Excel顯示模塊。該功能的實(shí)現(xiàn)依賴于DBGrid Control(網(wǎng)格控件)和Microsoft Remote Control控件的協(xié)同工作。</p><p> 在VC++ 6.0工作環(huán)境下,選擇菜單Project->Add to Project->Components and Controls Gallery,在組件與控件選擇對(duì)話框中雙擊Registered A
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)設(shè)計(jì)(論文)--基于vc++簡(jiǎn)易心電圖分析系統(tǒng)的開(kāi)發(fā)
- 基于vc++的點(diǎn)歌管理系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)畢業(yè)設(shè)計(jì)(論文)
- 畢業(yè)設(shè)計(jì)---基于vc++的視頻采集系統(tǒng)的開(kāi)發(fā)
- 基于VC++的圖像火焰檢測(cè)系統(tǒng)上位機(jī)軟件設(shè)計(jì)與實(shí)現(xiàn).pdf
- 畢業(yè)設(shè)計(jì)(論文)基于plc控制系統(tǒng)的注塑機(jī)控制系統(tǒng)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)論文-基于vc++的工資管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)設(shè)計(jì)---基于vc++的公路收費(fèi)站管理系統(tǒng)
- [vc++畢設(shè)]vc++醫(yī)藥管理系統(tǒng)+論文
- [vc++畢設(shè)]vc++航空檢票系統(tǒng)+論文
- 畢業(yè)設(shè)計(jì)(論文)-vc++超市進(jìn)銷存管理系統(tǒng)
- 基于VC++金屬切削機(jī)床主傳動(dòng)系統(tǒng)優(yōu)化設(shè)計(jì)(有VC++工程)--畢業(yè)設(shè)計(jì).doc
- 基于vc++的平面曲線繪制畢業(yè)設(shè)計(jì)論文
- 基于VC++金屬切削機(jī)床主傳動(dòng)系統(tǒng)優(yōu)化設(shè)計(jì)(有VC++工程)--畢業(yè)設(shè)計(jì).doc
- 基于VC++金屬切削機(jī)床主傳動(dòng)系統(tǒng)優(yōu)化設(shè)計(jì)(有VC++工程)--畢業(yè)設(shè)計(jì).doc
- 基于vc++的班級(jí)信息管理系統(tǒng)畢業(yè)論文
- 基于單片機(jī)的溫度控制系統(tǒng)畢業(yè)設(shè)計(jì)論文
- vc++賓館管理管理系統(tǒng)畢業(yè)論文
- 自動(dòng)加料機(jī)控制系統(tǒng)-畢業(yè)設(shè)計(jì)論文
- 畢業(yè)設(shè)計(jì)(論文)-基于單片機(jī)的電梯控制系統(tǒng)
- 基于VC++鹽穴三維地貌探測(cè)器上位機(jī)監(jiān)控系統(tǒng)設(shè)計(jì).pdf
評(píng)論
0/150
提交評(píng)論