版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 摘 要</b></p><p> 本論文以停車場的管理為主題,該系統(tǒng)軟件是使用WINDOWS操作平臺和SQL Server 2000開發(fā)的。本系統(tǒng)是一個功能比較完備的停車場系統(tǒng),通過實現(xiàn)串口通信,使用SQL Server數(shù)據(jù)庫處理圖像等技術(shù),使之具有Checkin、Checkout和計費等主要功能,并在這些功能支持下,停車場管理人員可以監(jiān)視出門的車輛是否和進(jìn)門
2、的車輛是同一輛,收款人員可以通過電子顯示屏、語音等多種方式告訴顧客應(yīng)付的金額,停車場的管理人員可以通過后臺的數(shù)據(jù)庫,得知收益狀況和對歷史交易記錄進(jìn)行查詢。</p><p> 關(guān)鍵字:串口通信,捕捉圖像,動畫播放,視頻</p><p><b> ABSTRACT</b></p><p> This thesis set the topic
3、of Park System,and the system bases on WINDOWS operating system and SQL Server 2000 database.This park system has mature functions,it communicates the interface and uses SQL Server managing the image which get from the v
4、idicon,so this system has the functions of Checkin,Checkout,charging and so on.</p><p> Having this functions,the manager can check if the car was the same car when it putting off,and tell the chauffeur how
5、 much must pay for which via the LED,voice and so on.The manger can know the income and inquire about the historical business record from the background database.</p><p> KEYWORDS:communication port,catch i
6、mage,cartoon play,</p><p> video frequency</p><p><b> 目 錄</b></p><p> 第一章 引言··············
7、3;····································
8、183;··3</p><p> 1.1本課題研究的目的及意義···························
9、3;·····3</p><p> 1.2本課題的研究目標(biāo)與預(yù)期達(dá)到的結(jié)果··················3</p><p> 第二章 串口通信概述及其實
10、現(xiàn)····································
11、83;·3</p><p> 2.1串口通信概述·····························
12、3;·············3</p><p> 2.2串口通信實現(xiàn)··················
13、;·························4</p><p> 2.2.1用控件的方法實現(xiàn)串口通信····
14、3;······················4</p><p> 2.2.2文件的方法實現(xiàn)串口通信·······
15、3;·····················6</p><p> 第三章 主要功能簡述·········
16、3;····································9&
17、lt;/p><p> 3.1打印憑據(jù)································
18、;···············9</p><p> 3.2抓拍圖像················
19、183;······························9</p><p> 3.3掃描條碼·
20、;····································
21、83;·········10</p><p> 3.4收費······················&
22、#183;····························10</p><p> 第四章 系統(tǒng)分析與設(shè)計··
23、;····································
24、83;·····10</p><p> 4.1數(shù)據(jù)庫設(shè)計·························
25、3;···················10</p><p> 4.2系統(tǒng)配置信息···········
26、3;·······························11</p><p> 4.3實現(xiàn)功能
27、的主界面····································
28、···13</p><p> 第五章 重點功能實現(xiàn)及其代碼···························&
29、#183;··········13</p><p> 5.1串口通信····················
30、83;··························13</p><p> 5.1.1初始化串口····
31、183;····································
32、16</p><p> 5.1.2發(fā)送數(shù)據(jù)·······························
33、············20</p><p> 5.1.3接收數(shù)據(jù)···················
34、························23</p><p> 5.1.4工作現(xiàn)程函數(shù)······
35、3;································26</p><p> 5
36、.2視頻功能的實現(xiàn)···································&
37、#183;······31</p><p> 第六章 自定義動畫播放························
38、;·····················36</p><p> 致謝···········
39、····································
40、3;··············38</p><p> 參考文獻(xiàn)·················
41、83;····································&
42、#183;···38</p><p><b> 第一章引言</b></p><p> 1.1本課題研究的目的及意義</p><p> 隨著社會經(jīng)濟(jì)的發(fā)展,汽車越來越多走進(jìn)家庭,開發(fā)一個具有憑票泊車、車輛拍照、語音報價、電子屏顯示費用、交費等一套完整的停車場的業(yè)務(wù)邏輯功能的停車場管理系統(tǒng)也就越來越有價值,因此,
43、停車場的管理顯得越來越重要。</p><p> :進(jìn)入21世紀(jì),信息處理技術(shù)有著突飛猛進(jìn)的發(fā)展,各類數(shù)據(jù)、信息急劇增長,大家對信息處理技術(shù)的利用已滲透到各行各業(yè)的各個環(huán)節(jié)中,而此同時我國汽車的產(chǎn)量和銷量也逐年增長,故對停車場的需求也逐年增加,而對停車場更需要有較好的管理,主要是實現(xiàn)對停車場的智能管理,實現(xiàn)給人們一個安全合理的服務(wù),為人們省去很多麻煩,讓人們更關(guān)注其他重要的事。</p><p&
44、gt; 1.2本課題的研究目標(biāo)與預(yù)期達(dá)到的結(jié)果</p><p> 本課題的研究目標(biāo)是建立一個功能比較完備的停車場系統(tǒng)。通過實現(xiàn)串口通信,使用SQL Server數(shù)據(jù)庫處理圖像等技術(shù),使之具有Checkin、Checkout和計費等主要功能,并在這些功能支持下,停車場管理人員可以監(jiān)視出門的車輛是否和進(jìn)門的車輛是同一輛,收款人員可以通過電子顯示屏、語音等多種方式告訴顧客應(yīng)付的金額,停車場的管理人員可以通過后臺的數(shù)
45、據(jù)庫,得知收益狀況和對歷史交易記錄進(jìn)行查詢。</p><p> 第二章串口通信概述及其實現(xiàn)</p><p><b> 2.1串口通信概述</b></p><p> 計算機(jī)進(jìn)行數(shù)據(jù)傳送的方式通常有兩種:一種是并行,一種是串行。</p><p> 并行數(shù)據(jù)傳送是指數(shù)據(jù)在多條并行、1位寬的傳輸線上,同時由發(fā)送方傳送到接
46、收方的數(shù)據(jù)傳送方式。串行數(shù)據(jù)傳送則是指數(shù)據(jù)在單條1位寬的傳輸線上,一位接一位地按順序分時傳送的數(shù)據(jù)傳送方式。并行數(shù)據(jù)通信的距離通常很短,串行數(shù)據(jù)通信的距離可以很長,從幾百米到幾千公里均可;并行數(shù)據(jù)通信的速度比串行數(shù)據(jù)通信快。</p><p> ?。?)串口通信的連接方式</p><p> 按照數(shù)據(jù)在傳輸線上的傳輸方向的不同,可以將串口通信分為:單工方式、半雙工方式和全雙工方式。</
47、p><p><b> ?。?)串口通信協(xié)議</b></p><p> 為了使通信雙方順利地進(jìn)行通信,那么發(fā)送方和接收方必須共同遵守一些基本的通信規(guī)則,比如雙方的同步方式、差錯校驗方式、數(shù)據(jù)傳輸?shù)乃俣取⑼ㄐ艌笪牡母袷郊翱刂谱址亩x與含義。這些通信規(guī)則也可以稱為通信協(xié)議,通常用到的協(xié)議有異步通信和同步通信兩種。</p><p> 2.2串口通信的
48、實現(xiàn)</p><p> 使用Visual C++實現(xiàn)串口通信的方法有三種:一種是使用微軟提供的MsComm控件的方法;一種是使用Visual C++提供的標(biāo)準(zhǔn)通信函數(shù)的方法;一種是使用API的方法,也就是使用文件的方法,串口也是文件。</p><p> 2.2.1用控件的方法實現(xiàn)串口通信:</p><p> 微軟公司提供了MSComm32控件,這個組件專門用于
49、串口通信,因此,我們可以使用該組件進(jìn)行串口通信程序的編寫。</p><p><b> ?。?)屬性</b></p><p> MSComm32控件提供了許多屬性,不過常用的并不是很多,下面是幾個常用的屬性:</p><p> CommPort:設(shè)置/取得串口號;</p><p> Settings:設(shè)置/取得串口通
50、信的波特率、奇偶校驗、數(shù)據(jù)位、停止位4個通信特征,這是一個字符串;</p><p> PortOpen:打開/關(guān)閉串口,TRUE為串口打開,F(xiàn)ALSE為串口關(guān)閉。</p><p> Input:從串口接收緩沖區(qū)中讀取數(shù)據(jù)。</p><p> Output:向串口發(fā)送緩沖區(qū)寫入數(shù)據(jù)。</p><p><b> ?。?)方法<
51、;/b></p><p> 當(dāng)這個控件加入到Visual C++的工程后,會產(chǎn)生針對于這個控件的類,默認(rèn)情況下類的名稱為CMSComm。當(dāng)然,我們可以進(jìn)行修改,這個類中提供了大量的方法,其中針對于上面提到的屬性操作的方法有:</p><p> void SetCommPort(short nNew Value);</p><p> 這個函數(shù)用來設(shè)置串口號
52、,即CommPort屬性。</p><p> short GetCommPort()</p><p> 這個函數(shù)用來獲取當(dāng)前操作的串口號。</p><p> void SetInBufferSize(short nNew Value);</p><p> 這個函數(shù)用來設(shè)置輸入緩沖區(qū)的大小。</p><p>
53、short GetInBufferSize();</p><p> 這個函數(shù)用來獲取輸入緩沖區(qū)的大小。</p><p> void SetOutBufferSize(short nNew Value);</p><p> 這個函數(shù)用來設(shè)置輸出緩沖區(qū)的大小。</p><p> short GetOutBufferSize();</
54、p><p> 這個函數(shù)用來獲取輸出緩沖區(qū)的大小。</p><p> Void SetPortOpen(BOOL bNewValue);</p><p> 這個函數(shù)通過bNewValue的值來打開/關(guān)閉串口,TRUE表示打開串口,F(xiàn)ALSE表示關(guān)閉串口。</p><p> BOOL GetPortOpen();</p>&l
55、t;p> 這個函數(shù)用來取得當(dāng)前串口的狀態(tài),是打開還是關(guān)閉。</p><p> Void SetOutput(const VARIANT&new Value);</p><p> 這個函數(shù)用來向串口中寫入數(shù)據(jù),或者稱為發(fā)送數(shù)據(jù)。</p><p> VARIANT GetInput();</p><p> 這個函數(shù)用來從串
56、口讀取數(shù)據(jù),或者稱為接收數(shù)據(jù)。</p><p> Void SetSetting(LPCTSTR lpszNewValue);</p><p> 這個函數(shù)用來設(shè)置Setting屬性,參數(shù)lpszNewValue是一個包含波特率、奇偶校驗、數(shù)據(jù)位、停止位信息的字符串。</p><p> CString GetSettings();</p><
57、p> 這個函數(shù)用來獲取串口的屬性,并返回到一個字符串中。</p><p> void SetCommEvent(short nNewValue);</p><p> 這個函數(shù)用來設(shè)置串口事件,對于這些已經(jīng)設(shè)置了的事件發(fā)生后,系統(tǒng)將會自動進(jìn)行響應(yīng),響應(yīng)函數(shù)為OnComm。在Visual C++中可以對這個函數(shù)進(jìn)行重載,然后再在這個事件響應(yīng)函數(shù)中,使用下面的short GetCom
58、mEvent()函數(shù)對發(fā)生的事件進(jìn)行分析,作出不同的動作。</p><p> void SetRThreshold(short nNewValue);</p><p> 這個函數(shù)用來設(shè)置接收數(shù)據(jù)事件發(fā)生的時間,當(dāng)接收緩沖區(qū)中有大于或等于參數(shù)nNewValue時,將發(fā)生接收數(shù)據(jù)事件,從而導(dǎo)致事件響應(yīng)函數(shù)OnComm的執(zhí)行。</p><p> ?。?)響應(yīng)串口事件介
59、紹</p><p> MSComm32控件提供了兩種響應(yīng)串口事件的方式:</p><p><b> ?、偈录?qū)動方式:</b></p><p> 當(dāng)串口事件(接收緩沖區(qū)中有數(shù)據(jù)、串口狀態(tài)發(fā)生了改變、串口操作發(fā)生錯誤等)發(fā)生后,會導(dǎo)致OnComm事件響應(yīng)函數(shù)的運(yùn)行,因此可以在應(yīng)用程序中獲取發(fā)生的事件,并經(jīng)過分析,針對不同的事件采取不同的操作。
60、這種方法有程序響應(yīng)及時,可靠性比較高的優(yōu)點。</p><p><b> ?、诓樵兎绞剑?lt;/b></p><p> 通過不斷地查看CommEvent屬性來得知當(dāng)前串口事件的發(fā)生情況。這種方法顯然沒有事件驅(qū)動方式對串口事件的響應(yīng)及時,比如當(dāng)查看程序的一次查看剛剛結(jié)束,事件就發(fā)生了,可是響應(yīng)事件要等到下一次查看發(fā)現(xiàn)后,才能進(jìn)行響應(yīng)。</p><p>
61、;<b> ?。?)使用</b></p><p> Visual C++中,使用MSComm控件方法進(jìn)行串口通信程序的編寫時,一般情況是將MSComm控件放入某個對話框中,然后在對話框類中定義這個控件對應(yīng)的控件類型的數(shù)據(jù)成員,之后再使用這個數(shù)據(jù)成員對串口進(jìn)行操作即可。對話框資源編輯環(huán)境中,默認(rèn)情況下是沒有MSComm控件的,我們可以首先將控件加入到工程中,這時會產(chǎn)生一個默認(rèn)名稱為CMsCo
62、mm的類,而且,對話框資源編輯環(huán)境中將會出現(xiàn)該控件的小圖標(biāo),只要將這個控件拖到對話框中即可。</p><p> 2.2.2文件的方法實現(xiàn)串口通信</p><p> 在16位的Windows中,有提供了一些關(guān)于串口通信的函數(shù),有OpenComm、WriteComm、ReadComm、CloseComm等,還提供了WM_COMMNOTIFY消息。在Win32系統(tǒng)中,除了一般意義上的文件外,
63、還有許多設(shè)備也被當(dāng)作文件進(jìn)行操作。下面介紹在32位Windows平臺下,使用Visual C++中的文件方法實現(xiàn)串口通信:</p><p><b> ?。?)打開串口</b></p><p> 串口在Win32中作為文件處理,它的打開函數(shù)是CreateFile。</p><p><b> 函數(shù)原型</b></p&
64、gt;<p> HANDLE CreateFile(</p><p> LPCTSTR lpFileName,</p><p> DWORD dwDesiredAccess,</p><p> DWORD dwShareMode,</p><p> LPSECURITY_ATTRIBUTES lpSecurityAt
65、tributes,</p><p> DWORD dwCreationDisposition,</p><p> DWORD dwFlagsAndAttributes,</p><p> HANDLE hTemplateFile</p><p><b> );</b></p><p>
66、第一個參數(shù)lpFileName:指定要打開的文件的文件名。</p><p> 第二個參數(shù)dwDesiredAccess:訪問模式。</p><p> 第三個參數(shù)dwShareMode:共享模式,對于串口來說,這個參數(shù)必須給定為0,也就是說,串口不能象一般的文件那樣共享,它屬于獨占設(shè)備。</p><p> 第四個參數(shù)lpSecurityAttributes:安全
67、屬性,指向一個SECURITY_ATTRIBUTES結(jié)構(gòu)體,可以通過它來設(shè)定設(shè)備文件的關(guān)聯(lián)內(nèi)核對象的安全屬性,以及設(shè)備文件句柄能否被繼承,一般給值為NULL,表示創(chuàng)建的文件句柄不能被繼承。</p><p> 第五個參數(shù)dwCreationDisposition:創(chuàng)建方式,對于串口來說,此參數(shù)必須設(shè)定為OPEN_EXISTING屬性,表示打開的是已經(jīng)存在的文件,如果文件(串口)不存在,則CreateFile函數(shù)失
68、敗。因此不能設(shè)定為CREATE_NEW、CREATE_ALWAYS、OPEN_ALWAY、STRUNCATE_EXISTING值。</p><p> 第六個參數(shù)dwFlagsAndAttributes:表示新創(chuàng)建文件的屬性和標(biāo)志,對于串口來說,如果設(shè)定了FILE_FLAG_OVERLAPPED,則表示串口通信方式是重疊式的也就是異步的,并且對串口進(jìn)行讀寫時必須定義OVERLAPPED結(jié)構(gòu)體。如果沒有設(shè)定FILE
69、_FLAG_OVERLAPPED,也就是缺省情況,表示串口通信是非重疊式的也就是說是同步的。在MS_DOS和16位的Windows下,許多程序員習(xí)慣使用同步方式,比如對文件進(jìn)行讀操作時,程序會處于等待狀態(tài),一直等到文件的讀操作結(jié)束返回后,程序才繼續(xù)執(zhí)行,用網(wǎng)絡(luò)的話來說就是阻塞。</p><p> 第七個參數(shù)hTemplateFile:臨時文件的句柄,必須給NULL值。</p><p>&
70、lt;b> 其返回值:</b></p><p> 成功:返回文件或設(shè)備的句柄,表示函數(shù)成功地創(chuàng)建或打開了一個文件或設(shè)備。</p><p> 失?。悍祷豂NVALID_HANDLE_VALUE。</p><p><b> ?。?)設(shè)置串口狀態(tài)</b></p><p> 打開串口后,接下來的事情應(yīng)該
71、是進(jìn)行串口通信,也就是進(jìn)行數(shù)據(jù)的讀寫??墒?,我們發(fā)現(xiàn)串口通信程序出現(xiàn)問題的原因,往往是沒有對串口的屬性進(jìn)行正確的設(shè)置。因此,在進(jìn)行串口數(shù)據(jù)讀寫之前,應(yīng)該進(jìn)行串口屬性的設(shè)置,這些屬性包括波特率、是否允許奇偶校驗、奇偶校驗的方式、每個字符的數(shù)據(jù)位數(shù)、接收發(fā)送緩沖區(qū)情況和停止位數(shù)等,在Windows中,把這些屬性包裝在一個稱為DCB的結(jié)構(gòu)體中。</p><p><b> (3)串口的讀寫</b>
72、</p><p> Win32中使用ReadFile()和 WriteFile()函數(shù)代替ReadComm()、WriteComm()函數(shù)來進(jìn)行串口的讀寫。</p><p><b> ?。?)異步串口通信</b></p><p> 對于異步操作方式的串口通信來說,當(dāng)調(diào)用了ReadFile函數(shù)或者WriteFile函數(shù)后,調(diào)用者會立
73、刻返回繼續(xù)做別的事情。Win32中使用線程同步內(nèi)核對象得知讀寫是否返回,可以通過SetCommMask函數(shù)來設(shè)置串口的事件掩碼,然后使用WaitCommEvent函數(shù)等待已經(jīng)設(shè)置的某個或某些串口事件的發(fā)生。</p><p> SetCommMask函數(shù):</p><p> BOOL SetCommMask(HANDLE hFile,DWORD dwEvtMask event);<
74、/p><p> hFile參數(shù):表示文件句柄。</p><p> Events:事件掩碼</p><p> 事件掩碼可以是如下值的組合:</p><p> EV_BREAK:檢測到一個輸入中斷;</p><p> EV_CTS:CTS信號改變狀態(tài);</p><p> EV_DSR:DSR
75、(數(shù)據(jù)設(shè)置就緒)信號改變狀態(tài);</p><p> EV_ERR:發(fā)生了線路狀態(tài)錯誤;</p><p> EV_RING:檢測到振鈴信號;</p><p> EV_RXCHAR:輸入緩沖區(qū)接收到新字符,并把這個字符放入輸入緩沖區(qū);</p><p> EV_RXFLAG:輸入緩沖區(qū)接收到事件字符(屬于DCB 結(jié)構(gòu)體的EvtChar數(shù)據(jù)成員
76、);</p><p> EV_TXEMPTY:出緩沖區(qū)的最后一個字符被發(fā)送出去;</p><p> (5)串口的超時設(shè)置</p><p> 對于串口通信來說,可以通過設(shè)置它的超時值來影響讀寫操作函數(shù)的返回,簡單地說,就是當(dāng)讀寫操作超過設(shè)置的時間段時返回。</p><p> 設(shè)置時,首先定義一個COMMTIMEOUTS結(jié)構(gòu)體變量,然后通
77、過SetCommmTimeouts函數(shù)進(jìn)行設(shè)置即可。</p><p> COMMTIMEOUTS結(jié)構(gòu)體定義如下:</p><p> Typedef struct_COMMTIMEOUTS{</p><p> DWORD ReadIntervalTimeout;</p><p> DWORD ReadTotalTimeoutMult
78、iplier;</p><p> DWORD ReadTotalTimeoutConstant;</p><p> DWORD WriteTotalTimeoutMultiplier;</p><p> DWORD WriteTotalTimeoutConstant;</p><p> }COMMTIMEOUTS,*LPCOMM
79、TIMEOUTS;</p><p> ReadIntervalTimeout:指的是讀取兩個字符的間隔超時指標(biāo),當(dāng)一個字符讀取結(jié)束后,開始計時,如果已經(jīng)超過了這個間隔,那么ReadFile函數(shù)將返回。</p><p> ReadTotalTimeoutMultiplier,WriteTotalTimeoutMultiplier:用來計算總超時的乘法器。</p><p
80、> ReadTotalTimeoutConstant,WriteTotalTimeoutConstant:這個值加上ReadTotalTimeoutMultiplier與需要讀取的字符數(shù)的乘積就是總超時。</p><p> 具體計算公式就是(其中的bytes指的是要讀取或?qū)懭氲淖止?jié)數(shù)):</p><p> 讀總超時值=( ReadTotalTimeoutMultiplier*b
81、ytes)+ ReadTotalTimeoutConstant</p><p> 寫總超時值=( WriteTotalTimeoutMultiplier*bytes)+ WriteTotalTimeoutConstant</p><p><b> ?。?)關(guān)閉串口</b></p><p> 當(dāng)不再使用串口后,應(yīng)該使用CloseHandle函
82、數(shù)將串口句柄關(guān)閉,CloseHandle函數(shù)原型;</p><p> BOOL CloseHandle(HANDLE hobject);</p><p> hObject:對于串口來說,指的是使用CreatFile函數(shù)打開串口時得到的句柄。</p><p><b> 其返回值:</b></p><p> TRU
83、E:表示成功關(guān)閉;</p><p> FALSE:表示關(guān)閉失敗;</p><p><b> 第三章主要功能簡述</b></p><p><b> 3.1打印憑據(jù)</b></p><p> 汽車到達(dá)停車場入口時,入口處的擋車器處于關(guān)閉狀態(tài)。管理員點擊“出票”按鈕后,系統(tǒng)打印一張印有當(dāng)前時間和憑
84、據(jù)號的紙票。司機(jī)拿到此票據(jù)后,管理員打開擋車器,汽車進(jìn)入停車場。</p><p> 在系統(tǒng)內(nèi)部要保存這個票號和它相關(guān)的數(shù)據(jù),為隨后汽車從出口駛出做準(zhǔn)備。</p><p><b> 3.2抓拍圖像</b></p><p> 在打印憑據(jù)的時候,系統(tǒng)同時要抓拍一張在進(jìn)口處的汽車的圖像,目的是為了在汽車駛出的時候進(jìn)行校驗。</p>
85、<p> 由于有上述的用法,所以要求本圖像一定要保存在數(shù)據(jù)庫中,在日后可以對停車場曾經(jīng)服務(wù)過的車輛進(jìn)行跟蹤。圖像格式要求采用JPEG方式,大小270像素×200像素左右。</p><p><b> 3.3掃描條碼</b></p><p> 在汽車駛出前司機(jī)要進(jìn)行交費,交費的時候司機(jī)要提供紙票。紙票上的號碼通過條形碼識別儀讀入到系統(tǒng)中。<
86、/p><p><b> 3.4收費</b></p><p> 在本系統(tǒng)中使用統(tǒng)一的費率標(biāo)準(zhǔn):2元/小時。計費的準(zhǔn)確性至少精確到秒。當(dāng)司機(jī)開車要離開停車場,在出口處出示憑據(jù)進(jìn)行掃描或者是人工輸入號碼,系統(tǒng)讀出車輛的停泊時間,根據(jù)費率計算司機(jī)應(yīng)付的錢款。</p><p> 司機(jī)交費后,管理員打開擋車器對車輛放行。</p><p
87、> 汽車在數(shù)據(jù)庫中的記錄要備份下來,其中包括使用的憑據(jù)的號碼、進(jìn)入時間、離開時間、進(jìn)入時候的圖像和交費。</p><p> 第四章系統(tǒng)分析與設(shè)計</p><p><b> 4.1數(shù)據(jù)庫設(shè)計</b></p><p> 本系統(tǒng)使用SQL Server數(shù)據(jù)庫VicAly,程序使用ODBC操作數(shù)據(jù)。</p><p>
88、; 下面介紹在VicAly數(shù)據(jù)庫中的各個數(shù)據(jù)表。</p><p> 在正式工作之前,管理員或者是收款員要輸入系統(tǒng)的帳號和口令才能進(jìn)入。因此要設(shè)計操作員表,如圖所示:</p><p><b> SQL語句為:</b></p><p> CREATE TABLE [dbo].[TAB_OPERATER] (</p><p
89、> [OPERATER] [varchar] (50) NOT NULL ,</p><p> [PASSWORD] [varchar] (50) NULL </p><p> ) ON [PRIMARY]</p><p> 汽車進(jìn)入停車場,系統(tǒng)立刻記錄下當(dāng)時的時間和司機(jī)所持的卡號還有當(dāng)時的汽車的圖像,所以TAB_COUNTTIME數(shù)據(jù)表的設(shè)計如圖所示
90、:</p><p> CARD_ID條形碼的,也就是司機(jī)所持的憑據(jù)上的條形碼的含義。</p><p> IN_TIME是汽車進(jìn)入時間。</p><p> CARD_IMAGE是在汽車進(jìn)入停車場之前,由系統(tǒng)拍攝得到的照片。</p><p><b> SQL語句為:</b></p><p>
91、 CREATE TABLE [dbo].[TAB_COUNTTIME] (</p><p> [CARD_ID] [varchar] (50) NOT NULL ,</p><p> [IN_TIME] [datetime] NULL ,</p><p> [CAR_IMAGE] [image] NULL </p><p><b&
92、gt; )</b></p><p> 系統(tǒng)的需求中要保存每個車輛進(jìn)入車場的歷史記錄,包括進(jìn)入時所持卡的號碼、進(jìn)入時間、出門時間、收費情況和當(dāng)時進(jìn)門時的圖像。根據(jù)上面的要求設(shè)計表TAB_HISTORY_CARD,字段說明如圖所示:</p><p> CARD_ID表示紙卡的卡號,也就是打印到憑據(jù)上的條形碼。</p><p> IN_TIME汽車進(jìn)入
93、的時間</p><p> OUT_TIME汽車駛出的時間</p><p> PAY_AMOUNT司機(jī)所交的費用</p><p> CAR_IMAGE汽車進(jìn)入時的圖片</p><p><b> SQL語句為:</b></p><p> CREATE TABLE [dbo].[TAB_HIS
94、TORY_CARD] (</p><p> [CARD_ID] [varchar] (50) NULL ,</p><p> [IN_TIME] [datetime] NULL ,</p><p> [OUT_TIME] [datetime] NULL ,</p><p> [PAY_AMOUNT] [money] NULL ,<
95、;/p><p> [CAR_IMAGE] [image] NULL </p><p> ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]</p><p> 4.2系統(tǒng)配置信息(主要配置ODBC數(shù)據(jù)庫)</p><p> 打開配置對話框,配置名為DSN_VicAly,驅(qū)程為SQL Server的數(shù)據(jù)源:</p
96、><p> 并改變默認(rèn)數(shù)據(jù)庫名為VicAly:</p><p> 4.3實現(xiàn)功能的主界面</p><p> 第五章重點功能實現(xiàn)及其代碼</p><p><b> 5.1串口通信</b></p><p> 在本系統(tǒng)中實現(xiàn)串口通信的類為CSerialPort,它是一個開發(fā)源碼的類,作者為Remo
97、n Spekreijse.</p><p><b> 類的定義:</b></p><p> 【代碼示例】CSerialPort類定義(串口通信類)</p><p> //*******************************************************</p><p> **FILE
98、NAMECSerialPort.h</p><p> **PURPOSEThis class can read, write and watch one serial port.</p><p> **It sends messages to its owner when something happends </p><p> on the
99、 port</p><p> ** The class creates a thread for reading and writing so the main</p><p> ** program is not blocked.</p><p> **AUTHORRemon Spekreijse</p&g
100、t;<p><b> */</b></p><p> #ifndef __SERIALPORT_H__</p><p> #define __SERIALPORT_H__</p><p> #define WM_COMM_BREAK_DETECTEDWM_USER+1</p><p> //
101、 A break was detected on input.</p><p> #define WM_COMM_CTS_DETECTEDWM_USER+2</p><p> // The CTS (clear-to-send) signal changed state. </p><p> #define WM_COMM_DSR_DETECTEDW
102、M_USER+3</p><p> // The DSR (data-set-ready) signal changed state. </p><p> #define WM_COMM_ERR_DETECTEDWM_USER+4</p><p> // A line-status error occurred. Line-status errors
103、are CE_FRAME, CE_OVERRUN, and CE_RXPARITY. </p><p> #define WM_COMM_RING_DETECTEDWM_USER+5</p><p> // A ring indicator was detected. </p><p> #define WM_COMM_RLSD_DETECTEDWM
104、_USER+6</p><p> // The RLSD (receive-line-signal-detect) signal changed state. </p><p> #define WM_COMM_RXCHARWM_USER+7</p><p> // A character was received and placed in th
105、e input buffer. </p><p> #define WM_COMM_RXFLAG_DETECTEDWM_USER+8</p><p> // The event character was received and placed in the input buffer. </p><p> #define WM_COMM_TXEMPTY
106、_DETECTEDWM_USER+9</p><p> // The last character in the output buffer was sent. </p><p> class CSerialPort</p><p> { </p><p><b> public:</
107、b></p><p> BOOL ClearRXBuffer();</p><p> // contruction and destruction</p><p> CSerialPort();</p><p> virtual~CSerialPort();</p><p> // port ini
108、tialisation</p><p> BOOLInitPort(CWnd* pPortOwner, UINT portnr = 3, UINT baud = 1200, char parity = 'E', UINT databits = 8, UINT stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR | EV_CTS,
109、UINT nBufferSize = 512);</p><p> // start/stop comm watching</p><p> BOOLStartMonitoring();</p><p> BOOLRestartMonitoring();</p><p> BOOLStopMonitoring();<
110、/p><p> DWORDGetWriteBufferSize();</p><p> DWORDGetCommEvents();</p><p> DCBGetDCB();</p><p> voidWriteToPort(char* string);</p><p> protected:&
111、lt;/p><p> // protected memberfunctions</p><p> voidProcessErrorMessage(char* ErrorText);</p><p> static UINTCommThread(LPVOID pParam);</p><p> static voidReceiveC
112、har(CSerialPort* port, COMSTAT comstat);</p><p> static voidWriteChar(CSerialPort* port);</p><p><b> // thread</b></p><p> CWinThread*m_Thread;</p><p&g
113、t; // synchronisation objects</p><p> CRITICAL_SECTIONm_csCommunicationSync;</p><p> BOOLm_bThreadAlive;</p><p> // handles</p><p> HANDLEm_hShutdownEvent
114、;</p><p> HANDLEm_hComm;</p><p> HANDLEm_hWriteEvent;</p><p> // Event array. </p><p> // One element is used for each event. There are two event handles fo
115、r each port.</p><p> // A Write event and a receive character event which is located in the overlapped structure (m_ov.hEvent).</p><p> // There is a general shutdown when the port is closed.
116、</p><p> HANDLEm_hEventArray[3];</p><p> // structures</p><p> OVERLAPPEDm_ov;</p><p> COMMTIMEOUTSm_CommTimeouts;</p><p> DCBm_dcb;<
117、/p><p> // owner window</p><p> CWnd*m_pOwner;</p><p><b> // misc</b></p><p> UINTm_nPortNr;</p><p> char*m_szWriteBuffer;</p&
118、gt;<p> DWORDm_dwCommEvents;</p><p> DWORDm_nWriteBufferSize;</p><p><b> };</b></p><p> #endif __SERIALPORT_H__</p><p> //**************
119、*****************************************</p><p><b> 初始化串口</b></p><p> 【代碼示例】初始化串口(CSerialPort::InitPort函數(shù))</p><p> //************************************************
120、*******</p><p><b> /*</b></p><p> **FILENAMECSerialPort.cpp</p><p> // Initialize the port. This can be port 1 to 4.</p><p><b> //</b>&l
121、t;/p><p> BOOL CSerialPort::InitPort(CWnd* pPortOwner,// the owner (CWnd) of the port (receives message)</p><p> UINT portnr,// portnumber (3..6)</p><p> UINT baud,// baudra
122、te</p><p> char parity,// parity </p><p> UINT databits,// databits </p><p> UINT stopbits,// stopbits </p><p> DWORD dwCommEvents,// EV_RXCHAR, EV_CTS et
123、c</p><p> UINT writebuffersize)// size to the writebuffer</p><p><b> {</b></p><p> //assert(portnr > 2 && portnr < 7);</p><p> assert(p
124、PortOwner != NULL);</p><p> // if the thread is alive: Kill</p><p> if (m_bThreadAlive)</p><p><b> {</b></p><p><b> do</b></p><p&
125、gt;<b> {</b></p><p> SetEvent(m_hShutdownEvent);</p><p> } while (m_bThreadAlive);</p><p> TRACE("Thread ended\n");</p><p><b> }</b&
126、gt;</p><p> // create events</p><p> if (m_ov.hEvent != NULL)</p><p> ResetEvent(m_ov.hEvent);</p><p> m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</p>
127、<p> if (m_hWriteEvent != NULL)</p><p> ResetEvent(m_hWriteEvent);</p><p> m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</p><p> if (m_hShutdownEvent != NULL)<
128、/p><p> ResetEvent(m_hShutdownEvent);</p><p> m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</p><p> // initialize the event objects</p><p> m_hEventArray[0]
129、 = m_hShutdownEvent;// highest priority</p><p> m_hEventArray[1] = m_ov.hEvent;</p><p> m_hEventArray[2] = m_hWriteEvent;</p><p> // initialize critical section</p><p
130、> InitializeCriticalSection(&m_csCommunicationSync);</p><p> // set buffersize for writing and save the owner</p><p> m_pOwner = pPortOwner;</p><p> if (m_szWriteBuffer !
131、= NULL)</p><p> delete [] m_szWriteBuffer;</p><p> m_szWriteBuffer = new char[writebuffersize];</p><p> m_nPortNr = portnr;</p><p> m_nWriteBufferSize = writebuffer
132、size;</p><p> m_dwCommEvents = dwCommEvents;</p><p> BOOL bResult = FALSE;</p><p> char *szPort = new char[50];</p><p> char *szBaud = new char[50];</p><
133、p> // now it critical!</p><p> EnterCriticalSection(&m_csCommunicationSync);</p><p> // if the port is already opened: close it</p><p> if (m_hComm != NULL)</p>&l
134、t;p><b> {</b></p><p> CloseHandle(m_hComm);</p><p> m_hComm = NULL;</p><p><b> }</b></p><p> // prepare port strings</p><p>
135、; sprintf(szPort, "COM%d", portnr);</p><p> sprintf(szBaud, "baud=%d parity=%c data=%d stop=%d", baud, parity, databits, stopbits);</p><p> // get a handle to the port<
136、/p><p> m_hComm = CreateFile(szPort,// communication port string (COMX)</p><p> GENERIC_READ | GENERIC_WRITE,// read/write types</p><p> 0, // comm devices must be opened with
137、exclusive access</p><p> NULL,// no security attributes</p><p> OPEN_EXISTING,// comm devices must use OPEN_EXISTING</p><p> FILE_FLAG_OVERLAPPED,// Async I/O</p><
138、;p> 0);// template must be 0 for comm devices</p><p> if (m_hComm == INVALID_HANDLE_VALUE)</p><p><b> {</b></p><p> // port not found</p><p> dele
139、te [] szPort;</p><p> delete [] szBaud;</p><p> return FALSE;</p><p><b> }</b></p><p> // set the timeout values</p><p> m_CommTimeouts.Re
140、adIntervalTimeout = 1000;</p><p> m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;</p><p> m_CommTimeouts.ReadTotalTimeoutConstant = 1000;</p><p> m_CommTimeouts.WriteTotalTimeo
141、utMultiplier = 1000;</p><p> m_CommTimeouts.WriteTotalTimeoutConstant = 1000;</p><p> // configure</p><p> if (SetCommTimeouts(m_hComm, &m_CommTimeouts))</p><p>
142、 { </p><p> if (SetCommMask(m_hComm, dwCommEvents))</p><p><b> {</b></p><p> if (GetCommState(m_hComm, &m_dcb))</p><p><b> {</b>
143、;</p><p> m_dcb.fRtsControl = RTS_CONTROL_ENABLE;// set RTS bit high!</p><p> if (BuildCommDCB(szBaud, &m_dcb))</p><p><b> {</b></p><p> if (SetCo
144、mmState(m_hComm, &m_dcb))</p><p> ; // normal operation... continue</p><p><b> else</b></p><p> ProcessErrorMessage("SetCommState()");</p><p&
145、gt;<b> }</b></p><p><b> else</b></p><p> ProcessErrorMessage("BuildCommDCB()");</p><p><b> }</b></p><p><b> els
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 本科畢業(yè)論文——停車場管理系統(tǒng)的設(shè)計與實現(xiàn)
- 停車場管理系統(tǒng)畢業(yè)論文
- 停車場管理系統(tǒng)畢業(yè)論文
- 停車場收費管理系統(tǒng)畢業(yè)論文
- 停車場收費管理系統(tǒng)畢業(yè)論文
- 計算機(jī)本科畢業(yè)論文--在線考試系統(tǒng)
- 計算機(jī)專業(yè)本科畢業(yè)論文(招聘管理系統(tǒng))
- 智能停車場管理系統(tǒng)設(shè)計畢業(yè)論文
- 停車場(庫)計費管理系統(tǒng)計算機(jī)選型原則
- 計算機(jī)專業(yè)本科畢業(yè)論文
- 計算機(jī)專業(yè)本科畢業(yè)論文
- 計算機(jī)專業(yè)本科畢業(yè)論文
- 計算機(jī)本科畢業(yè)論文--企業(yè)人事管理系統(tǒng)設(shè)計
- 智能停車場畢業(yè)論文
- 計算機(jī)本科畢業(yè)論文-delphi稅務(wù)信息采集系統(tǒng)
- 停車場管理系統(tǒng)畢業(yè)設(shè)計論文
- 基于計算機(jī)通信技術(shù)的停車場收費系統(tǒng)設(shè)計
- 計算機(jī)本科畢業(yè)論文校園網(wǎng)站設(shè)計
- 計算機(jī)本科畢業(yè)論文---計算機(jī)局域網(wǎng)組建與應(yīng)用
- 軟件工程畢業(yè)論文-停車場管理系統(tǒng)——前臺設(shè)計
評論
0/150
提交評論