版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 學(xué) 位 論 文</b></p><p> 標(biāo)準(zhǔn)化工業(yè)儀表上位機(jī)調(diào)試調(diào)試平臺(tái)設(shè)計(jì)</p><p> 作 者 姓 名: 許康 </p><p> 學(xué) 科 專 業(yè): 測(cè)控技術(shù)與儀器 </p><p> 學(xué) 號(hào):
2、 102028128 </p><p> 指 導(dǎo) 教 師: 張劍平(教授) </p><p> 完 成 日 期: 2014-06-07 </p><p><b> 太原工業(yè)學(xué)院</b></p><p> Taiyuan Institute of Tec
3、hnology</p><p><b> 誠(chéng)信申明</b></p><p><b> 本人申明:</b></p><p> 本人所提交的畢業(yè)設(shè)計(jì)(論文)《標(biāo)準(zhǔn)化工業(yè)儀表上位機(jī)調(diào)試調(diào)試平臺(tái)設(shè)計(jì)》的所有材料是本人在指導(dǎo)教師指導(dǎo)下獨(dú)立研究、寫作、完成的成果,設(shè)計(jì)(論文)中所引用他人的無(wú)論以何種方式發(fā)布的文字、研究成果,均在
4、設(shè)計(jì)(論文)中加以說(shuō)明;有關(guān)教師、同學(xué)和其他人員對(duì)我的設(shè)計(jì)(論文)的寫作、修訂提出過(guò)并為我在設(shè)計(jì)(論文)中加以采納的意見(jiàn)、建議,均已在我的致謝辭中加以說(shuō)明并深致謝意。</p><p> 本設(shè)計(jì)(論文)和資料若有不實(shí)之處,本人承擔(dān)一切相關(guān)責(zé)任。</p><p><b> 特此申明。</b></p><p> 本人簽名:
5、 </p><p><b> 2014年6月7日</b></p><p> 畢業(yè)設(shè)計(jì)(論文)任務(wù)書</p><p> 設(shè)計(jì)(論文)題目: 標(biāo)準(zhǔn)化工業(yè)儀表上位機(jī)調(diào)試調(diào)試平臺(tái)設(shè)計(jì) </p><p> 系部: 電子工程系
6、 專業(yè):測(cè)控技術(shù)與儀器 學(xué)號(hào): 102028128 </p><p> 學(xué)生: 許康 指導(dǎo)教師(含職稱): 張劍平(教授) </p><p><b> 課題意義及目標(biāo)</b></p><p> 針對(duì)工業(yè)儀表目前存在品種繁多、兼容性差、維護(hù)困難等諸多不利現(xiàn)狀
7、,構(gòu)建具有圖形化運(yùn)算模型的工業(yè)儀表操作系統(tǒng)是非常必要的,其思路是通過(guò)數(shù)學(xué)模型和優(yōu)化算法,將儀表設(shè)置和信息加工運(yùn)算轉(zhuǎn)變成圖形化運(yùn)算模型,用戶只要初具儀表常識(shí),拿手指觸摸圖案就可以輕松完成儀表的配置、運(yùn)算模型設(shè)定、監(jiān)控、維護(hù)和升級(jí)等操作。</p><p><b> 主要內(nèi)容</b></p><p> 本課題的任務(wù)是實(shí)現(xiàn)工業(yè)儀表上位機(jī)的調(diào)試平臺(tái)的程序設(shè)計(jì)。</p&
8、gt;<p><b> 要求:</b></p><p> (1)對(duì)各個(gè)控件進(jìn)行調(diào)用實(shí)現(xiàn)單個(gè)儀表或全部?jī)x表的信息調(diào)度;</p><p> ?。?)能將儀表的內(nèi)容顯示在上位機(jī)界面上;</p><p> (3)上位機(jī)和在線儀表可以組成一個(gè)DCS系統(tǒng)。</p><p><b> 主要參考文獻(xiàn)<
9、;/b></p><p> [1] 張劍平. 智能化檢測(cè)系統(tǒng)及儀器[M]. 第二版. 國(guó)防工業(yè)出版社, 2009-07. </p><p> [2] Blanchette J, Summerfield M. C++ GUI Programming with Qt 4[M]. 2nd Revised Edition. Prentice Hall, 2008-02.</p>
10、;<p> [3](美)薩維奇, 周靖. C++程序設(shè)計(jì)[M]. 第八版. 清華大學(xué)出版社, 2012-02-01.</p><p><b> 進(jìn)度安排</b></p><p> 標(biāo)準(zhǔn)化工業(yè)儀表上位機(jī)調(diào)試調(diào)試平臺(tái)設(shè)計(jì)</p><p><b> 摘要</b></p><p>
11、本文主要是介紹基于Windows系統(tǒng)和QT 制作標(biāo)準(zhǔn)化工業(yè)儀表上位機(jī)調(diào)試平臺(tái)的設(shè)計(jì)方法。設(shè)計(jì)的主要目的是實(shí)現(xiàn)上位機(jī)與標(biāo)準(zhǔn)化工業(yè)儀表下位機(jī)的通訊,使普通用戶也能夠遠(yuǎn)程完成對(duì)下位機(jī)儀表狀態(tài)的監(jiān)控。此調(diào)試平臺(tái)是以計(jì)算機(jī)為基礎(chǔ),通過(guò)串口或者其他通訊方式與標(biāo)準(zhǔn)化工業(yè)儀表進(jìn)行通訊,將儀表的信息傳輸?shù)狡脚_(tái)上,在一個(gè)界面實(shí)現(xiàn)同時(shí)監(jiān)控一個(gè)或多個(gè)儀表的實(shí)時(shí)信息,從而實(shí)現(xiàn)遠(yuǎn)距離監(jiān)控的目的。調(diào)試平臺(tái)是在Windows系統(tǒng)下,利用QT制作出人機(jī)交互界面,使用C+
12、+編程語(yǔ)言實(shí)現(xiàn)軟件的基本功能與軟件界面的結(jié)合。本軟件的兩個(gè)特點(diǎn):1. 能夠?qū)崿F(xiàn)多種方式與下位機(jī)的通訊;2. 能夠?qū)崟r(shí)動(dòng)態(tài)顯示下位機(jī)信息。</p><p> 關(guān)鍵詞: 上位機(jī),TCP通訊,串口通訊,實(shí)時(shí)監(jiān)控</p><p> The Debugging PC Platform of the standardized Industrial Instrumentation </p>
13、;<p><b> Abstract</b></p><p> The artist focus on introducing the design methods of the debugging PC platform of the standardized industrial instrumentation which is developed by QT in t
14、he Windows System. The main purposes of designing is to make connection between the host PC and the standardized industrial instrumentation and show the information received by the TCP or any other way which making ordin
15、ary people can monitor the real-time state of the instrumentation by a long distance .The PC platform can connect the instru</p><p> Key words:PC Platform, TCP Communication, Serial Communication, real-time
16、 Monitoring</p><p><b> 目 錄</b></p><p><b> 1緒論1</b></p><p> 1.1研究的背景和意義1</p><p> 1.2主要實(shí)現(xiàn)的功能1</p><p> 2開(kāi)發(fā)平臺(tái)和開(kāi)發(fā)語(yǔ)言簡(jiǎn)介3</p
17、><p> 2.1WINDOWS系統(tǒng)介紹3</p><p> 2.1.1WINDOWS系統(tǒng)的由來(lái)和發(fā)展3</p><p> 2.1.2 WINDOWS系統(tǒng)的特點(diǎn)4</p><p> 2.2QT 開(kāi)發(fā)工具和開(kāi)發(fā)語(yǔ)言的介紹5</p><p> 2.2.1QT的誕生和發(fā)展5</p>&l
18、t;p> 2.2.2QT 開(kāi)發(fā)的優(yōu)點(diǎn)和特點(diǎn)5</p><p> 2.2.3C++語(yǔ)言介紹6</p><p> 3SQLite 數(shù)據(jù)庫(kù)簡(jiǎn)介8</p><p> 3.1 SQLITE 數(shù)據(jù)庫(kù)的由來(lái)和發(fā)展8</p><p> 3.2 SQLITE 數(shù)據(jù)庫(kù)的特點(diǎn)9</p><p> 3.3 數(shù)
19、據(jù)庫(kù)設(shè)計(jì)10</p><p><b> 4軟件設(shè)計(jì)12</b></p><p> 4.1軟件功能概要12</p><p> 4.1.1 軟件結(jié)構(gòu)圖12</p><p> 4.1.2 軟件部分功能流程圖13</p><p> 4.2用戶登錄模塊的設(shè)計(jì)16</p>
20、;<p> 4.3狀態(tài)顯示模塊的設(shè)計(jì)21</p><p> 4.4軟件主界面設(shè)計(jì)22</p><p> 4.5軟件通信模塊設(shè)計(jì)25</p><p> 4.5.1軟件通信模塊25</p><p> 4.5.2TCP 通信模塊26</p><p> 4.5.3UDP 通信模塊
21、28</p><p> 4.5.4串口通信模塊29</p><p> 4.6信息處理和顯示模塊的設(shè)計(jì)31</p><p> 4.6.1 電壓模塊33</p><p> 4.6.2 電流模塊40</p><p> 4.6.3 波形模塊41</p><p> 4.6.4
22、速度模塊45</p><p> 4.7用戶管理模塊的設(shè)計(jì)47</p><p> 4.8 幫助模塊的設(shè)計(jì)49</p><p><b> 5 總結(jié)51</b></p><p><b> 參考文獻(xiàn)52</b></p><p><b> 致謝5
23、3</b></p><p><b> 附錄54</b></p><p><b> 1緒論</b></p><p><b> 研究的背景和意義</b></p><p> 工業(yè)儀表是使用廣泛的電氣設(shè)備,生產(chǎn)生活中無(wú)處不是工業(yè)儀表的身影,大到機(jī)場(chǎng)、研究院,小到社
24、區(qū)、家庭,工業(yè)儀表的普遍性與重要性可見(jiàn)一斑。然而,由于各企事業(yè)單位的建設(shè)是按照自身?xiàng)l件來(lái)逐步增加設(shè)備的,而儀表的生產(chǎn)廠商也是按照這些企事業(yè)單位的要求來(lái)配置儀表的,再加上生產(chǎn)廠商基于技術(shù)保密等原因的考慮,最終使市場(chǎng)上的工業(yè)儀表形成了儀表品種繁多、標(biāo)準(zhǔn)不一、兼容性差、利用率低等一系列問(wèn)題,同時(shí)隨著網(wǎng)絡(luò)節(jié)點(diǎn)的增多,如何實(shí)現(xiàn)遠(yuǎn)程監(jiān)控儀表狀態(tài),脫離工業(yè)現(xiàn)場(chǎng)的束縛,成了一個(gè)全新的課題。近幾年,從國(guó)外的一些產(chǎn)品我們也能看到新一代儀表的一些發(fā)展趨勢(shì)。如
25、PHILIPS公司,近年來(lái)推出一種基于工業(yè)總線的模塊化產(chǎn)品,每個(gè)模塊都可以獨(dú)立完成規(guī)定的任務(wù),多個(gè)模塊也可相互配合完成規(guī)定的任務(wù),但僅限于控制模塊,并沒(méi)有標(biāo)準(zhǔn)化的要求及操作系統(tǒng)。</p><p> 目的和意義:為解決上述問(wèn)題,研發(fā)一種能夠具有統(tǒng)一標(biāo)準(zhǔn),兼容性良好,利用率高的工業(yè)儀表成為了關(guān)鍵。</p><p> 本課題恰恰是致力于這種工業(yè)儀表的上位機(jī)調(diào)試平臺(tái)的設(shè)計(jì)與研發(fā)。此調(diào)試平臺(tái)是以
26、計(jì)算機(jī)為基礎(chǔ),通過(guò)串口或者其他通訊方式與標(biāo)準(zhǔn)化工業(yè)儀表進(jìn)行通訊,將儀表的信息傳輸?shù)狡脚_(tái)上,在一個(gè)界面實(shí)現(xiàn)同時(shí)監(jiān)控一個(gè)或多個(gè)儀表的實(shí)時(shí)信息,從而實(shí)現(xiàn)遠(yuǎn)距離監(jiān)控的目的。通過(guò)與下位機(jī)的標(biāo)準(zhǔn)化工業(yè)儀表相結(jié)合,從而達(dá)到簡(jiǎn)化人員操作,實(shí)現(xiàn)標(biāo)準(zhǔn)統(tǒng)一,兼容性好,利用率高的一種工業(yè)儀表的最終目標(biāo)。</p><p><b> 主要實(shí)現(xiàn)的功能</b></p><p><b>
27、 主要實(shí)現(xiàn)的功能:</b></p><p> 實(shí)現(xiàn)了上位機(jī)與下位機(jī)通過(guò)TCP、UDP及串口通信功能;</p><p> 實(shí)現(xiàn)了下位機(jī)信息的實(shí)時(shí)動(dòng)態(tài)顯示功能;</p><p> 實(shí)現(xiàn)了用戶登錄校驗(yàn)功能。</p><p> 開(kāi)發(fā)平臺(tái)和開(kāi)發(fā)語(yǔ)言簡(jiǎn)介</p><p> WINDOWS系統(tǒng)介紹</p&
28、gt;<p> WINDOWS系統(tǒng)的由來(lái)和發(fā)展</p><p> WINDOWS系統(tǒng),即Microsoft Windows系統(tǒng),是微軟公司推出的一系列的操作系統(tǒng)。最早版本的Windows 推出于1985年,起初僅僅是MS-DOS之下的桌面環(huán)境,其后續(xù)版本逐漸發(fā)展成為個(gè)人電腦和服務(wù)器用戶設(shè)計(jì)的操作系統(tǒng),并最終在世界個(gè)人電腦操作系統(tǒng)領(lǐng)域內(nèi)占據(jù)壟斷地位。Windows系統(tǒng)擁有不同的平臺(tái)版本,如個(gè)人電腦
29、、服務(wù)器以及近幾年剛剛涉及的移動(dòng)設(shè)備領(lǐng)域,其中在個(gè)人電腦領(lǐng)域內(nèi)應(yīng)用最為普遍。</p><p> Windows起源可以追溯到多年前的施樂(lè)公司所進(jìn)行的研發(fā)工作。1970年,美國(guó)施樂(lè)公司成立了著名的研究機(jī)構(gòu)帕羅奧多研究中心,主要從事局域網(wǎng)絡(luò)、激光打印機(jī)、圖形用戶界面和面向?qū)ο蠹夹g(shù)的研究。施樂(lè)公司于1981年宣布推出世界上第一個(gè)商用的圖形用戶界面系統(tǒng)“Star 8010”工作站。但由于種種原因,此技術(shù)并未得到大眾的重
30、視,也沒(méi)有協(xié)助商業(yè)化的應(yīng)用。這時(shí),蘋果計(jì)算機(jī)的創(chuàng)始人之一的史蒂夫?喬布斯在參觀了施樂(lè)公司的帕羅奧多研究中心后認(rèn)識(shí)到了圖形用戶界面的重要性及廣闊的市場(chǎng)前景,便開(kāi)始著手進(jìn)行自己的圖形用戶界面系統(tǒng)的研發(fā)工作并于1983年研發(fā)出第一個(gè)圖形用戶界面系統(tǒng)Lisa。不久第二個(gè)圖形用戶界面系統(tǒng)Macintosh 推出,并成為了世界上第一個(gè)成功的商業(yè)圖形用戶界面系統(tǒng)。但由于蘋果計(jì)算機(jī)的商業(yè)化考慮,及Intel x86微處理器芯片的IBM兼容計(jì)算機(jī)已漸露頭
31、角,因此就給了微軟公司所開(kāi)發(fā)的Windows生存空間和市場(chǎng)。微軟公司也意識(shí)到了創(chuàng)建業(yè)界標(biāo)準(zhǔn)的重要性,所以在1983年春季就宣布開(kāi)始研究開(kāi)發(fā)Windows,并于1985年和1987年分別推出了Windows 1.0版和Windows 2.0版。</p><p> WINDOWS 系統(tǒng)的特點(diǎn)</p><p> 本課題所進(jìn)行的軟件開(kāi)發(fā)是基于Window 7。Windows 7操作系統(tǒng)是微軟公
32、司最新推出的基于 Windows Vista升級(jí)的操作系統(tǒng),相對(duì)于以往的系統(tǒng) Windows 7的錯(cuò)誤診斷和修復(fù)機(jī)制更加強(qiáng)大,能夠在用戶最少的干預(yù)下完成修復(fù)工作;開(kāi)機(jī)和關(guān)機(jī)速度更快,改善了用戶體驗(yàn)度。</p><p> Windows 7 因其創(chuàng)新的性能、出色的兼容性和卓越的使用體驗(yàn),獲得了來(lái)自IT各界人士的一致好評(píng)。以下為Windows 7 的3個(gè)特點(diǎn)。</p><p><b&g
33、t; 更加簡(jiǎn)單</b></p><p> Windows 7將會(huì)讓搜索和使用信息更加簡(jiǎn)單,包括本地、網(wǎng)絡(luò)和互聯(lián)網(wǎng)搜索功能;直觀的用戶體驗(yàn)將更加高級(jí)。</p><p><b> 更加安全</b></p><p> Windows 7包括改進(jìn)的安全和功能合法性,還將數(shù)據(jù)保護(hù)和管理擴(kuò)展到外圍設(shè)備。Windows 7改進(jìn)了基于角色的
34、計(jì)算方案和用戶賬戶管理,在數(shù)據(jù)保護(hù)和兼顧協(xié)作的固有沖突之間搭建了溝通橋梁,同時(shí)也開(kāi)啟了企業(yè)級(jí)的數(shù)據(jù)保護(hù)和權(quán)限許可。</p><p><b> 更好的連接</b></p><p> Windows 7將進(jìn)一步增強(qiáng)移動(dòng)工作能力,無(wú)論在 何時(shí)、何地,任何設(shè)備都能訪問(wèn)數(shù)據(jù)和應(yīng)用程序,開(kāi)啟堅(jiān)固的特別協(xié)作體驗(yàn),無(wú)線連接、管理和安全功能進(jìn)一步擴(kuò)展,性能和當(dāng)前功能以及新興移動(dòng)硬件
35、得到了優(yōu)化,多設(shè)備同步、管理和數(shù)據(jù)保護(hù)功能被擴(kuò)展。 另外,Windows 7還帶來(lái)了靈活計(jì)算基礎(chǔ)設(shè)施,包括 網(wǎng)絡(luò)中心模型。</p><p> QT 開(kāi)發(fā)工具和開(kāi)發(fā)語(yǔ)言的介紹</p><p><b> QT的誕生和發(fā)展</b></p><p> QT是一個(gè)跨平臺(tái)C++圖形用戶界面應(yīng)用程序開(kāi)發(fā)框架。它既可以開(kāi)發(fā)GUI程序,也可用于開(kāi)發(fā)非GUI
36、程序,比如控制臺(tái)工具和服務(wù)器。QT是面向?qū)ο蟮目蚣?,使用特殊的代碼生成擴(kuò)展(稱為元對(duì)象編譯器(Meta Object Compiler, moc))以及一些宏,易于擴(kuò)展,允許組件編程。</p><p> 1991年,Haavard Nord 和 Eirik Chambe-Eng 開(kāi)始開(kāi)發(fā)QT,并于1994年創(chuàng)立公司Trolltech,中文名為“奇趣科技”,2008年 Trolltech被NOKIA 公司收購(gòu),以
37、增強(qiáng)該公司在跨平臺(tái)軟件研發(fā)方面的實(shí)力,更名為QT Software。</p><p> 2009年5月11日,諾基亞QT Software宣布QT源代碼管理系統(tǒng)面向公眾開(kāi)放,QT開(kāi)發(fā)人員可通過(guò)QT 以及與QT相關(guān)的項(xiàng)目貢獻(xiàn)代碼、翻譯、示例以及其他內(nèi)容,協(xié)助引導(dǎo)和塑造QT未來(lái)的發(fā)展。</p><p> 2012年8月9日,Digia宣布已完成對(duì)諾基亞QT業(yè)務(wù)以及軟件技術(shù)的全面收購(gòu)。201
38、4年,跨平臺(tái)集成開(kāi)發(fā)環(huán)境QT Creator 3.1 發(fā)布,實(shí)現(xiàn)了對(duì)于iOS的完全支持,新增WinRT、Beautifier等插件,廢棄了無(wú)Python接口的GDB調(diào)試支持,集成了基于Clang的C/C++代碼模塊,并對(duì)Android支持做出了調(diào)整,至此實(shí)現(xiàn)了全面支持iOS、Android、WP。</p><p> QT 開(kāi)發(fā)的優(yōu)點(diǎn)和特點(diǎn)</p><p> QT 所具有的優(yōu)點(diǎn)和特點(diǎn)主要
39、為以下幾個(gè):</p><p> 優(yōu)良的跨平臺(tái)特性:QT支持下列操作系統(tǒng):Microsoft Windows 7/8, Microsoft Windows NT, Linux , Unix ,FreeBSD, Ubuntu , SCO等;</p><p><b> 面向?qū)ο?lt;/b></p><p> QT具有良好的封裝機(jī)制,這也使得其模塊化
40、成都非常高,可重用性好,對(duì)用戶的開(kāi)發(fā)非常方便;QT 提供了SIGNAL/SLOT 的安全類來(lái)簡(jiǎn)化各個(gè)元件之間的協(xié)同操作;</p><p><b> 豐富的API</b></p><p> QT 包括多大250個(gè)以上的C++類,提供了基于模板的collections,date/time類。也提供對(duì)正則表達(dá)式的處理;</p><p> 支持2
41、D/3D 圖形渲染,支持OpenGL;</p><p> 擁有大量的開(kāi)發(fā)文檔,多種實(shí)例;</p><p><b> 支持XML。</b></p><p><b> C++語(yǔ)言介紹</b></p><p> C++是在C語(yǔ)言的基礎(chǔ)上開(kāi)發(fā)的一種集面向?qū)ο缶幊?、泛型編程和過(guò)程化編程于一體的編程語(yǔ)言
42、,而QT則是C++的比較知名的開(kāi)源庫(kù)之一。因而想要使用QT進(jìn)行軟件開(kāi)發(fā),學(xué)習(xí)C++也就成了至關(guān)重要的基礎(chǔ)。</p><p> 計(jì)算機(jī)誕生初期,人們要使用計(jì)算機(jī)必須用機(jī)器語(yǔ)言或匯編語(yǔ)言編寫程序。世界上第一種計(jì)算機(jī)高級(jí)語(yǔ)言是誕生于1954年的FORTRAN語(yǔ)言。之后出現(xiàn)了多種計(jì)算機(jī)高級(jí)語(yǔ)言,其中使用最廣泛、影響最大的當(dāng)推BASIC語(yǔ)言和C語(yǔ)言。BASIC語(yǔ)言是1964年由 Dartmouth 學(xué)院 John G.
43、Kemeny 與 Thomas E. Kurtz 兩位教授在FORTRAN語(yǔ)言的基礎(chǔ)上簡(jiǎn)化而成的, 適用于初學(xué)者設(shè)計(jì)的小型高級(jí)語(yǔ)言;C語(yǔ)言是1972年由美國(guó)貝爾實(shí)驗(yàn)室的D.M.Ritchie所開(kāi)發(fā),采用結(jié)構(gòu)化編程方法,遵從自頂向下的原則。在操作系統(tǒng)和系統(tǒng)使用程序以及需要對(duì)硬件進(jìn)行操作的場(chǎng)合,用C語(yǔ)言明顯優(yōu)于其它高級(jí)語(yǔ)言,但在編寫大型程序時(shí),C語(yǔ)言仍面臨著挑戰(zhàn)。</p><p> 1983年,在C語(yǔ)言基礎(chǔ)上貝爾實(shí)
44、驗(yàn)室的Bjarne Stroustrup推出了C++。 C++進(jìn)一步擴(kuò)充和完善了C語(yǔ)言,是一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,目前流行的C語(yǔ)言版本。</p><p> C++語(yǔ)言既保留了C語(yǔ)言的有效性、靈活性、便于移植等全部精華和特點(diǎn),又添加了面向?qū)ο缶幊痰闹С?,具有?qiáng)大的編程功能,可方便地構(gòu)造出模擬現(xiàn)實(shí)問(wèn)題的實(shí)體和操作;編寫出的程序具有結(jié)構(gòu)清晰、易于擴(kuò)充等優(yōu)良特性,適合于各種應(yīng)用軟件、系統(tǒng)軟件的程序設(shè)計(jì)。用C++編寫
45、的程序可讀性好,生成的代碼質(zhì)量高,運(yùn)行效率僅比匯編語(yǔ)言慢10%~20%。</p><p> C++語(yǔ)言具有以下特點(diǎn)。</p><p> C++語(yǔ)言是C語(yǔ)言的超集。它保持了C語(yǔ)言簡(jiǎn)潔高效等特點(diǎn),同時(shí)能夠其編譯系統(tǒng)能夠檢查更多的語(yǔ)法錯(cuò)誤,因而C++比C語(yǔ)言更加的安全。</p><p> C++保持了與C語(yǔ)言的兼容。絕大多數(shù)C語(yǔ)言程序可以不經(jīng)修改直接在C++環(huán)境中運(yùn)
46、行,用C語(yǔ)言編寫的眾多庫(kù)函數(shù)可以用于C++程序中。</p><p> 支持面向?qū)ο蟪绦蛟O(shè)計(jì)的特征。C++既支持面向過(guò)程的程序設(shè)計(jì),又支持面向?qū)ο蟮某绦蛟O(shè)計(jì)。</p><p> C++程序在可重用性、可擴(kuò)充性、可維護(hù)性和可靠性等方面都較C語(yǔ)言得到了提高,使其更適合開(kāi)發(fā)大中型的系統(tǒng)軟件和應(yīng)用程序。</p><p> C++設(shè)計(jì)成直接的和廣泛的支援多種程序設(shè)計(jì)風(fēng)格(
47、程序化程序設(shè)計(jì)、資料抽象化、面向?qū)ο蟪绦蛟O(shè)計(jì)、泛型程序設(shè)計(jì))。</p><p> C++設(shè)計(jì)成無(wú)需復(fù)雜的程序設(shè)計(jì)環(huán)境。</p><p> SQLITE 數(shù)據(jù)庫(kù)簡(jiǎn)介</p><p> 3.1 SQLITE 數(shù)據(jù)庫(kù)的由來(lái)和發(fā)展</p><p> 從某個(gè)角度來(lái)說(shuō),SQLITE 最初的構(gòu)思是在一條軍艦上進(jìn)行的。SQLITE的作者D. Rich
48、ard Hipp當(dāng)時(shí)正在為美國(guó)海軍編制一種是用在導(dǎo)彈驅(qū)逐艦上的程序。那個(gè)程序最初是運(yùn)行在Hewlett-Packard Unix(HPUX)上,后臺(tái)使用Informix數(shù)據(jù)庫(kù)。Informix數(shù)據(jù)庫(kù)功能很強(qiáng)大,一個(gè)有經(jīng)驗(yàn)的數(shù)據(jù)庫(kù)管理員也需要一整天來(lái)進(jìn)行安裝升級(jí)。</p><p> 2000年1月,Hipp開(kāi)始和一個(gè)同事討論關(guān)于創(chuàng)建一個(gè)簡(jiǎn)單的內(nèi)嵌式SQL數(shù)據(jù)庫(kù)的想法,這個(gè)數(shù)據(jù)庫(kù)將使用GNU DBM B-Tree
49、library (gdbm)做后臺(tái),同時(shí)這個(gè)數(shù)據(jù)庫(kù)將不需要安裝和管理支持。后來(lái),在閑暇時(shí)間,Hipp就開(kāi)始實(shí)施這項(xiàng)工作,并在2000年的8月份發(fā)布了SQLITE的1.0版。</p><p> 按照原計(jì)劃,SQLITE 1.0 用gdbm 來(lái)進(jìn)行存儲(chǔ)管理。不過(guò),Hipp 很快就換成了自己的B-tree,以便于支持事物和主鍵的存儲(chǔ)。在以后的幾年里,開(kāi)源社區(qū)的其他成員開(kāi)始為自己喜歡的程序編寫SQLITE擴(kuò)展。SQLI
50、TE的ODBC接口可以為Perl、Python、Ruby、Java和其它主流的程序設(shè)計(jì)語(yǔ)言提供支持,這證明了SQLITE有廣闊的應(yīng)用前景。</p><p> 2004年,SQLITE從版本2升級(jí)到版本3,增加了內(nèi)置的對(duì)UTF-8、UTF-16及用戶定義字符集的支持。除國(guó)際化功能外,版本3的其它新特性包括:經(jīng)過(guò)修補(bǔ)的C API,更緊湊的數(shù)據(jù)庫(kù)文件格式(比原來(lái)節(jié)省25%的空間),弱類型,大二進(jìn)制對(duì)象(BLOB)的支
51、持,64-bit的ROWID,auto vacuum和改進(jìn)了的并發(fā)控制。盡管增加了這一系列新特性,版本3的運(yùn)行庫(kù)仍然小于240K字節(jié)。</p><p> SQLITE持續(xù)增長(zhǎng)并始終堅(jiān)持其最初的設(shè)計(jì)目標(biāo):簡(jiǎn)單、彈性、緊湊、速度和徹底的易用。</p><p> 3.2 SQLITE 數(shù)據(jù)庫(kù)的特點(diǎn)</p><p> 在SQLITE的觀念和實(shí)現(xiàn)中,都遵循著一系列指導(dǎo)原
52、則。下面就來(lái)詳述這些原則。</p><p><b> 零配置</b></p><p> 從SQLITE的設(shè)計(jì)之始,就沒(méi)準(zhǔn)備在應(yīng)用時(shí)使用DBA。配置和管理SQLITE就像得到它一樣簡(jiǎn)單。</p><p><b> 兼容性</b></p><p> SQLITE在設(shè)計(jì)時(shí)特別注意了兼容性。針對(duì)Wi
53、ndows、Linux、BSD、Mac OS X及商用的Unix 系統(tǒng)如AIX和Solaris,嵌入式平臺(tái)如Vxworks、Palm OS 和Windows CE,SQLITE 都可以編譯運(yùn)行,同時(shí),對(duì)于16-bit、32-bit和64-bit體系結(jié)構(gòu),SQLITE也能夠?qū)崿F(xiàn)無(wú)縫工作并能夠同時(shí)適應(yīng)字節(jié)的大端格式和小端格式。SQLITE的兼容性并不只表現(xiàn)在代碼上,還表現(xiàn)在其數(shù)據(jù)庫(kù)文件上。SQLITE的數(shù)據(jù)庫(kù)文件在其所支持的所有操作系統(tǒng)、硬
54、件體系結(jié)構(gòu)和字節(jié)順序上都是一致的。SQLITE數(shù)據(jù)庫(kù)文件在遷移時(shí)不需要進(jìn)行任何的轉(zhuǎn)換和修改。此外,SQLITE內(nèi)置的支持UTF-8和UTF-16編碼。</p><p><b> 緊湊性</b></p><p> SQLITE的設(shè)計(jì)功能齊全但體積很小,只需要1個(gè)頭文件,1個(gè)庫(kù),不需要擴(kuò)展的數(shù)據(jù)庫(kù)服務(wù)。所有資料打包之后不過(guò)1/4M。</p><p&
55、gt;<b> 簡(jiǎn)單</b></p><p> 作為程序庫(kù),SQLITE的API可以算是最簡(jiǎn)單最易用的了。同時(shí)SQLITE具有很好的幫助文檔。</p><p><b> 適應(yīng)性</b></p><p> 作為一個(gè)內(nèi)嵌式的數(shù)據(jù)庫(kù),SQLITE具有以下兩個(gè)特點(diǎn):強(qiáng)有力而可伸縮的關(guān)系型數(shù)據(jù)庫(kù)前端,簡(jiǎn)單而緊湊的B-tree
56、后端。</p><p><b> 不受拘束的授權(quán)</b></p><p> SQLITE的全部代碼都在公共域中,不需要授權(quán)。無(wú)論你如何是用SQLITE ,都不會(huì)有法律方面的限制。</p><p><b> 可靠性</b></p><p> SQLITE源代碼包含大約30000行標(biāo)準(zhǔn)C代碼,它
57、是干凈的、模塊化的和完好注釋的。SQLITE源代碼易理解、易定制。</p><p> SQLITE的核心軟件(庫(kù)和工具)由約30000行代碼組成,但分發(fā)的程序中還包含有超過(guò)30000行的回歸測(cè)試代碼,它們覆蓋了97%的核心代碼。也就是說(shuō),超過(guò)一半的SQLITE項(xiàng)目代碼是專門用于回歸測(cè)試的,也就是說(shuō),差不多每寫一行功能代碼,都要寫一行測(cè)試代碼對(duì)它進(jìn)行測(cè)試。</p><p><b>
58、; 易用性</b></p><p> SQLITE還提供一些獨(dú)特的功能來(lái)提高易用性,包括動(dòng)態(tài)類型、沖突解決和“附加”多個(gè)數(shù)據(jù)庫(kù)到一個(gè)連接的能力。</p><p><b> 3.3 數(shù)據(jù)庫(kù)設(shè)計(jì)</b></p><p> 數(shù)據(jù)庫(kù)設(shè)計(jì)(Database Design)是指對(duì)于一個(gè)給定的應(yīng)用環(huán)境,構(gòu)造最優(yōu)的數(shù)據(jù)庫(kù)模式,建立數(shù)據(jù)庫(kù)及其
59、應(yīng)用系統(tǒng),使之能夠有效地存儲(chǔ)數(shù)據(jù),滿足各種用戶的應(yīng)用需求(信息要求和處理要求)。數(shù)據(jù)庫(kù)在一個(gè)信息管理系統(tǒng)中占有非常重要的地位,數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)的好壞將直接對(duì)應(yīng)用系統(tǒng)的效率以及實(shí)現(xiàn)的效果產(chǎn)生影響。合理的數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)可以提高數(shù)據(jù)存儲(chǔ)的效率,保證數(shù)據(jù)庫(kù)的完整和一致。同時(shí),合理的數(shù)據(jù)庫(kù)結(jié)構(gòu)也將有利于程序的實(shí)現(xiàn)。</p><p> 由于本課題只是針對(duì)用戶信息使用了數(shù)據(jù)庫(kù),所以,數(shù)據(jù)庫(kù)內(nèi)只需要設(shè)計(jì)一張用于存放用戶信息的表即
60、可。</p><p> UserInformation表的結(jié)構(gòu)如下:</p><p> 圖 3.1 用戶數(shù)據(jù)表設(shè)計(jì)</p><p> 將UserName和Password均設(shè)置為主鍵,避免出現(xiàn)密碼為空的情況。</p><p> 使用SQL語(yǔ)句建表,設(shè)置用戶名和密碼為主鍵。</p><p> create ta
61、ble UserInformation (</p><p> UserName Varchar NOT NULL,</p><p> Password Varchar NOT NULL,</p><p> PRIMARY KEY (UserName, Password)</p><p><b> )</b><
62、;/p><p><b> 軟件設(shè)計(jì)</b></p><p><b> 軟件功能概要</b></p><p> 4.1.1 軟件結(jié)構(gòu)圖</p><p> 上位機(jī)下設(shè)六個(gè)模塊,分別為登錄模塊、狀態(tài)顯示模塊、通信模塊、信息顯示模塊、用戶管理模塊和幫助模塊。</p><p>
63、軟件的結(jié)構(gòu)框架如下圖:</p><p> 登錄模塊:通過(guò)與SQLITE數(shù)據(jù)庫(kù)的連接,進(jìn)行用戶密碼的校驗(yàn),以提高軟件的安全性。</p><p> 狀態(tài)顯示模塊:此模塊的主要目的是通過(guò)直觀的方式向用戶顯示下位機(jī)與上位機(jī)的連接狀態(tài),用戶界面登錄之后,主界面內(nèi)的顯示的第一個(gè)界面即為狀態(tài)顯示界面。</p><p> 通信模塊:主要涉及上位機(jī)與下位機(jī)的通信方式,目前實(shí)現(xiàn)了
64、TCP通信、UDP通信和串口通信,同時(shí)能夠顯示設(shè)備的連接狀態(tài)。</p><p> 信息顯示模塊:采用了QT 2D繪圖方法,使用代碼繪制界面。通過(guò)代碼判斷下位機(jī)發(fā)送的信息內(nèi)容來(lái)實(shí)現(xiàn)下位機(jī)狀態(tài)的實(shí)時(shí)動(dòng)態(tài)顯示。</p><p> 用戶管理模塊:通過(guò)與SQLITE數(shù)據(jù)庫(kù)的連接,可進(jìn)行添加新用戶,修改密碼等操作。</p><p> 幫助模塊:實(shí)現(xiàn)版本信息提示等功能。&l
65、t;/p><p> 4.1.2 軟件部分功能流程圖</p><p> 圖 4.2 登錄模塊流程</p><p> 圖 4.3 通信模塊流程圖</p><p> 圖 4.4 修改密碼流程</p><p> 圖 4.5 更改用戶密碼流程</p><p><b> 用戶登錄模塊的設(shè)計(jì)
66、</b></p><p> 用戶登錄界面采用傳統(tǒng)布局方式,將我校的?;兆鳛檐浖膱D標(biāo),將我校的圖片作為登錄背景,并取消最大化窗口。</p><p> 窗體實(shí)現(xiàn)效果如下圖:</p><p> 首先,將QWidget 作為用戶登錄界面的UI,在UI設(shè)計(jì)界面添加相應(yīng)的控件,通過(guò)拖拽控件實(shí)現(xiàn)登錄按鈕、取消按鈕、用戶名提示、密碼提示、用戶名輸入和密碼輸入。在
67、此基礎(chǔ)上,添加以下函數(shù)設(shè)置窗體的效果。</p><p> void Login::setTheStyle ()</p><p><b> {</b></p><p> /*設(shè)置窗體居中*/</p><p> int x = (qApp->desktop ()->width()- this->wi
68、dth ())/2;</p><p> int y = (qApp->desktop ()->height() - this->height ())/2;</p><p> this->move (x,y);</p><p> /*設(shè)置窗體大小固定*/</p><p> int width = this->
69、;geometry ().width ();</p><p> int height = this->geometry ().height ();</p><p> this->setFixedSize (width,height);</p><p> /*設(shè)置背景圖片*/</p><p> QPixmap pixmap
70、(":/new/prefix1/gate.jpg");</p><p> QPalette palette=this->palette();</p><p> palette.setBrush(QPalette::Background,QBrush(pixmap));</p><p> this->setPalette(pale
71、tte);</p><p> ui->passwordLine->setPlaceholderText (tr("請(qǐng)輸入密碼"));</p><p> ui->passwordLine->setEchoMode (QLineEdit::Password);</p><p> ui->nameLine->s
72、etFocus ();</p><p><b> }</b></p><p> 將登錄按鈕和取消登錄按鈕使用connect 函數(shù)與信號(hào)槽相連接,其中信號(hào)clicked()為系統(tǒng)提供的信號(hào),槽close()為系統(tǒng)提供,login()槽為自定義,用以實(shí)現(xiàn)用戶登錄信息的校驗(yàn)。</p><p> connect (ui->cancelBut
73、ton,SIGNAL(clicked()),this,SLOT(close()));</p><p> connect (ui->confirmButton,SIGNAL(clicked()),this,SLOT(login()));</p><p> 函數(shù)void login () 聲明為自定義信號(hào)槽。Login函數(shù)用以判斷登錄時(shí),用戶名、密碼是否為空,用戶名、密碼是否正確。&
74、lt;/p><p> void Login::login()</p><p><b> {</b></p><p> /*判斷用戶名是否為空*/</p><p> if(ui->nameLine->text ().isEmpty ()){</p><p> QMessageBox
75、::warning (this,tr("警告"),</p><p> tr("請(qǐng)輸入用戶名!"),</p><p> QMessageBox::Ok);</p><p> ui->nameLine->setFocus ();</p><p><b> return;<
76、/b></p><p><b> }</b></p><p> else if (ui->passwordLine->text ().isEmpty ()) {</p><p> QMessageBox::warning (this,tr("警告"),</p><p> tr
77、("請(qǐng)輸入密碼!"),</p><p> QMessageBox::Ok);</p><p><b> return;</b></p><p><b> }</b></p><p> 使用代碼在數(shù)據(jù)庫(kù)中查詢輸入的用戶名,將密碼進(jìn)行比對(duì)。如果密碼正確,則顯示程序主窗體,錯(cuò)誤
78、,顯示錯(cuò)誤提示。</p><p> /*數(shù)據(jù)庫(kù)操作語(yǔ)句*/ </p><p> QString information = QString ("select * from UserInformation where NAME = '%1'").arg (ui->nameLine->text () );</p><p&
79、gt; QSqlQuery query;</p><p> QString userPassword;</p><p> if(query.exec(information)){</p><p> int s_password = query.record().indexOf("PASS");</p><p>
80、while (query.next()){</p><p> userPassword = query.value(s_password).toString();</p><p> userPassword = query.value (1).toString ();</p><p><b> }</b></p><p
81、><b> }</b></p><p> if(userPassword == ui->passwordLine->text ()){</p><p> if(m_mainwindow == NULL)</p><p><b> {</b></p><p> m_main
82、window = new MainWindow;</p><p><b> }</b></p><p> m_mainwindow->show ();</p><p> this->hide ();</p><p><b> }</b></p><p>&
83、lt;b> 錯(cuò)誤處理代碼如下。</b></p><p> QMessageBox::warning (this,tr("警告"),tr("用戶名或密碼錯(cuò)誤\n"</p><p> "請(qǐng)重新輸入"),QMessageBox::Yes);</p><p> ui->nameLin
84、e->setFocus ();</p><p> ui->nameLine->selectAll ();</p><p> ui->passwordLine->clear ();</p><p><b> 狀態(tài)顯示模塊的設(shè)計(jì)</b></p><p> 狀態(tài)顯示模塊為用戶登錄成功后,主
85、界面顯示的第一個(gè)界面。狀態(tài)顯示模塊的主要目的是為了能夠更加直觀的向用戶顯示下位機(jī)和上位機(jī)的連接狀態(tài),為了達(dá)到這個(gè)目的,模塊的界面設(shè)計(jì)使用QLabel來(lái)存放上位機(jī)、下位機(jī)和連接狀態(tài)的圖片,字符使用QPushButton存放,設(shè)計(jì)為扁平化,并且將字體顏色進(jìn)行了設(shè)計(jì)。</p><p><b> 字體顏色實(shí)現(xiàn)代碼:</b></p><p> ui->stateBut
86、ton->setStyleSheet ("color:red");</p><p> connect (ui->stateButton,SIGNAL(clicked()),this,SLOT(connectSignal()));</p><p> 信號(hào)的產(chǎn)生主要是為了能夠通過(guò)狀態(tài)顯示界面的離線按鈕點(diǎn)擊,調(diào)用出通信設(shè)置界面。</p><
87、p><b> 軟件主界面設(shè)計(jì)</b></p><p> 軟件主界面采用QMainwindow類制作UI,創(chuàng)建stackwidget用于存放各個(gè)子界面,將各個(gè)子界面壓入stackwidget中,通過(guò)QMainwindow的公共函數(shù)setCentralWidget(),將stackwidget設(shè)置為主界面的centralwidget。通過(guò)自寫代碼實(shí)現(xiàn)各個(gè)菜單,并將菜單的按鈕(QActi
88、on)添加到菜單上。然后,創(chuàng)建自定義的信號(hào)槽,通過(guò)QAction的信號(hào)triggered() 與對(duì)應(yīng)的信號(hào)槽相連接,從而將界面按鈕的功能實(shí)現(xiàn),信號(hào)槽的主要實(shí)現(xiàn)將創(chuàng)建的各個(gè)子界面顯示到主界面的功能。</p><p> 創(chuàng)建各個(gè)菜單的按鈕。</p><p> void MainWindow::createActions()</p><p><b> {&
89、lt;/b></p><p> stateAction = new QAction(this);</p><p> stateAction->setText (tr("狀態(tài)"));</p><p> portAction = new QAction(this);</p><p> portAction-
90、>setText (tr("端口設(shè)置"));</p><p> aboutAction =new QAction(this);</p><p> aboutAction->setText ("關(guān)于Qt");</p><p> aboutAuth = new QAction(this);</p>
91、<p> aboutAuth ->setText ("關(guān)于軟件");</p><p><b> }</b></p><p> 首先創(chuàng)建各個(gè)動(dòng)作,即QAction,然后創(chuàng)建菜單,將各個(gè)動(dòng)作添加到菜單中。</p><p> void MainWindow::createMenus()</p>
92、<p><b> {</b></p><p> portMenu = new QMenu;</p><p> portMenu = menuBar ()->addMenu (tr("設(shè)置"));</p><p> aboutMenu = new QMenu;</p><p>
93、 aboutMenu = menuBar ()->addMenu (tr("關(guān)于"));</p><p> createActions ();</p><p> portMenu->addAction(portAction);</p><p> portMenu->addAction(stateAction);</
94、p><p> aboutMenu->addAction(aboutAction);</p><p><b> }</b></p><p> 創(chuàng)建各個(gè)子界面,并將子界面進(jìn)行壓棧,壓入stackwidget中。</p><p> void MainWindow::createStack()</p>&
95、lt;p><b> {</b></p><p> m_stack = new QStackedWidget(this);</p><p> m_stateUI = new StateForm;</p><p> m_portSetting = new PortSettingForm;</p><p> m
96、_userUI = new userForm;</p><p> m_detailStateUI = new frmMain;</p><p> m_stack->addWidget (m_stateUI);</p><p> m_stack->addWidget (m_portSetting);</p><p> m_s
97、tack->addWidget (m_userUI);</p><p> m_stack->addWidget (m_detailStateUI);</p><p> m_stack->setCurrentIndex (0);</p><p> this->setCentralWidget (m_stack);</p>&
98、lt;p><b> }</b></p><p> 創(chuàng)建自定義信號(hào)槽,用于將子界面顯示在主界面中。</p><p> 使用connect函數(shù)將信號(hào)與信號(hào)槽連接起來(lái),完成主界面設(shè)計(jì)。</p><p> connect (portAction,SIGNAL(triggered()),this,SLOT(showPortUI()));&l
99、t;/p><p> connect (stateAction,SIGNAL(triggered()),this,SLOT(showStateUI()));</p><p> connect(ui->action_U,SIGNAL(triggered()),this,SLOT(showUserUI()));</p><p> connect (aboutAct
100、ion,SIGNAL(triggered()),this,SLOT(aboutQT()));</p><p> void MainWindow::showStateUI()</p><p><b> {</b></p><p> m_stack->setCurrentIndex (0);</p><p>&l
101、t;b> }</b></p><p> void MainWindow::showPortUI()</p><p><b> {</b></p><p> m_stack->setCurrentIndex (1);</p><p><b> }</b></p&
102、gt;<p> void MainWindow::showUserUI()</p><p><b> {</b></p><p> m_stack->setCurrentIndex (2);</p><p><b> }</b></p><p> void MainWi
103、ndow::aboutQT()</p><p><b> {</b></p><p> QMessageBox::aboutQt (this);</p><p><b> }</b></p><p> void MainWindow::showDetail()</p><
104、p><b> {</b></p><p> m_stack->setCurrentIndex (3);</p><p><b> }</b></p><p><b> 軟件通信模塊設(shè)計(jì)</b></p><p> 軟件通信模塊為整個(gè)軟件的核心部分,能否順利實(shí)
105、現(xiàn)上位機(jī)與下位機(jī)的通信,軟件通信模塊的代碼實(shí)現(xiàn)至關(guān)重要。首先要成功實(shí)現(xiàn)TCP,UDP和串口通信方式,針對(duì)各個(gè)通信方式的設(shè)定,對(duì)串口通信的配置,都對(duì)接下來(lái)的顯示模塊打下了基礎(chǔ)。</p><p><b> 軟件通信模塊</b></p><p> 通信模塊的設(shè)計(jì)包括兩個(gè)部分,UI界面設(shè)計(jì)和功能實(shí)現(xiàn)。UI界面通過(guò)設(shè)計(jì)界面通過(guò)拖拽控件實(shí)現(xiàn)界面的設(shè)計(jì)。</p>
106、<p> 軟件設(shè)計(jì)時(shí),采用單一方式選擇方式,只能選擇一種連接方式。界面左部為通信方式選擇,右半部份為設(shè)備連接狀態(tài)。</p><p> 選擇連接方式后,右下部的狀態(tài)提示欄會(huì)給出相應(yīng)的狀態(tài)提示。</p><p><b> TCP 通信模塊</b></p><p> 對(duì)于TCP通信模塊,采用可控的設(shè)計(jì),可選擇監(jiān)聽(tīng)的IP地址和端口,在
107、UI界面選擇TCP連接方式后,填寫相應(yīng)的端口和IP地址,點(diǎn)擊連接按鈕,即可通訊。</p><p> TCP創(chuàng)建連接的實(shí)現(xiàn)代碼如下。</p><p> void PortSettingForm::newTcpConnect()</p><p><b> {</b></p><p> socket = new QTc
108、pSocket(this);</p><p> socket->abort ();</p><p> socket->connectToHost (ui->comboBox_2->currentText (),ui->lineEdit_2->text ().toInt ());</p><p> connect (socke
109、t,SIGNAL(readyRead()),this,SLOT(readDataFromTcp()));</p><p> connect (socket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError( QAbstractSocket::SocketError)));</p><p><
110、b> }</b></p><p> 其中 函數(shù)void PortSettingForm::displayError(QAbstractSocket::SocketError)為自定義信號(hào)槽,用于TCP錯(cuò)誤輸出,readReady信號(hào)每當(dāng)新的數(shù)據(jù)到來(lái)時(shí),都會(huì)被觸發(fā)。error(QAbstractSocket::SocketError)信號(hào)會(huì)將socket的信號(hào)發(fā)出。</p>&l
111、t;p> 函數(shù)void PortSettingForm::readDataFromTcp()用于接收TCP數(shù)據(jù)。</p><p> socket->isReadable () 返回true ,表示有至少一個(gè)數(shù)據(jù)報(bào)待讀取。socket->readAll ()將TCP流中的所有數(shù)據(jù)。dataFromTcp.truncate (dataFromTcp.indexOf ("E")
112、)會(huì)對(duì)數(shù)據(jù)包進(jìn)行截?cái)啵俣〝?shù)據(jù)包以字符E為結(jié)束符)。</p><p> void PortSettingForm::readDataFromTcp()</p><p><b> {</b></p><p> if(socket->isReadable ())</p><p><b> {</
113、b></p><p> QString dataFromTcp = socket->readAll ();</p><p> recievedData = dataFromTcp.truncate (dataFromTcp.indexOf ("E"));</p><p> connectReadySignal (1);</
114、p><p><b> }</b></p><p><b> }</b></p><p> void PortSettingForm::displayError(QAbstractSocket::SocketError)</p><p><b> {</b></p>
115、;<p> qDebug() << socket->errorString ()<<endl;</p><p><b> }</b></p><p><b> UDP 通信模塊</b></p><p> UDP通信模塊的設(shè)計(jì)和TCP基本一致,其實(shí)現(xiàn)代碼如下。</p&
116、gt;<p> void PortSettingForm::newUdpConnect()</p><p><b> {</b></p><p> socketUdp = new QUdpSocket(this);</p><p> socketUdp->bind(ui->lineEdit_2->text
117、 ().toInt (), QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);</p><p> connect(socketUdp,SIGNAL(readyRead()),this,SLOT(readDataFromUdp()));</p><p><b> }</b></p><
118、;p> 此處的bind是個(gè)重載函數(shù),連接本機(jī)的port端口,采用ShareAddress模式(即允許其它的服務(wù)連接到相同的地址和端口,特別是用在多客戶端監(jiān)聽(tīng)同一個(gè)服務(wù)器端口等時(shí)特別有效),和ReuseAddressHint模式(重新連接服務(wù)器),readyRead()信號(hào)是每當(dāng)有新的數(shù)據(jù)來(lái)臨時(shí)就被觸發(fā),readDataFromUdp()信號(hào)槽為自定義信號(hào)槽,用來(lái)接收UDP數(shù)據(jù)。</p><p> has
119、PendingDatagrams返回true時(shí)表示至少有一個(gè)數(shù)據(jù)報(bào)在等待被讀取,pendingDatagramSize為返回第一個(gè)在等待讀取報(bào)文的size,resize函數(shù)是把datagram的size歸一化到參數(shù)size的大小一樣, 將讀取到的不大于datagram.size()大小數(shù)據(jù)輸入到datagram.data()中,datagram.data()返回的是一個(gè)字節(jié)數(shù)組中存儲(chǔ)數(shù)據(jù)位置的指針。</p><p&g
120、t; void PortSettingForm::readDataFromUdp()</p><p><b> {</b></p><p> while(socketUdp->hasPendingDatagrams())</p><p><b> {</b></p><p> QBy
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 標(biāo)準(zhǔn)化工業(yè)儀表上位機(jī)調(diào)試調(diào)試平臺(tái)設(shè)計(jì)測(cè)控技術(shù)與儀器畢業(yè)論文
- 工業(yè)機(jī)械手設(shè)計(jì)學(xué)士學(xué)位論文
- 河北學(xué)士學(xué)位論文管理平臺(tái)
- 基于catia開(kāi)發(fā)的標(biāo)準(zhǔn)化工業(yè)廠房設(shè)計(jì)
- 學(xué)士學(xué)位論文
- bbs學(xué)士學(xué)位論文
- 優(yōu)秀學(xué)士學(xué)位論文(設(shè)計(jì))概要
- 學(xué)士學(xué)位論文--多功能飲水機(jī)硬件設(shè)計(jì)
- 儀表調(diào)試方案
- 學(xué)士學(xué)位論文開(kāi)題報(bào)告
- 儀表調(diào)試記錄
- 生物技術(shù)專業(yè)學(xué)士學(xué)位論文(設(shè)計(jì))
- 家用數(shù)字心率計(jì)設(shè)計(jì)學(xué)士學(xué)位論文
- 論文申請(qǐng)學(xué)士學(xué)位的條件
- 學(xué)士學(xué)位論文(設(shè)計(jì))synthesis and properties of zine ternary compl
- 基于單片機(jī)的卷曲糾偏系統(tǒng)的設(shè)計(jì)學(xué)士學(xué)位論文
- 哈爾濱工程大學(xué)學(xué)士學(xué)位論文
- 學(xué)士學(xué)位論文causes and control of cracks in concrete
- 學(xué)士學(xué)位論文原創(chuàng)性聲明.doc
- 學(xué)士學(xué)位論文原創(chuàng)性聲明.doc
評(píng)論
0/150
提交評(píng)論