劉晉,, 步亞男,, 金禹含, 蘇臣
?。ㄟ|寧師范大學(xué) 計(jì)算機(jī)信息與技術(shù)學(xué)院,, 遼寧 大連 116000)
摘要:在嵌入式領(lǐng)域中,經(jīng)常需要一些上位機(jī)的控制系統(tǒng),,而WPF是專門用來(lái)編寫(xiě)表示層的技術(shù)和工具,。為了真實(shí)地感受WPF技術(shù)與其他界面開(kāi)發(fā)工具的不同和優(yōu)點(diǎn),設(shè)計(jì)了一款板卡檢測(cè)系統(tǒng),,并詳細(xì)地介紹了此控制系統(tǒng)的實(shí)現(xiàn)過(guò)程。經(jīng)過(guò)實(shí)際應(yīng)用證明,,WPF技術(shù)與傳統(tǒng)的界面開(kāi)發(fā)工具相比開(kāi)發(fā)較簡(jiǎn)單,,程序更加簡(jiǎn)潔清晰,更重要的是其開(kāi)發(fā)理念更符合自然哲學(xué)的思想,。
關(guān)鍵詞:UDP通信,;嵌入式系統(tǒng);WPF,;檢測(cè)系統(tǒng)
0引言
GUI程序開(kāi)發(fā)工具歷經(jīng)了Win32 API,、MFC、Windows Forms等的變遷,,每一次變遷都使開(kāi)發(fā)效率和質(zhì)量產(chǎn)生飛躍,。2007年微軟推出了新一代GUI開(kāi)發(fā)工具Windows Presentation Foundation(WPF),并且把它定為未來(lái)10年Windows平臺(tái)GUI開(kāi)發(fā)的主要技術(shù),。WPF基于DirecX底層接口,,帶來(lái)優(yōu)秀的圖形向量渲染引擎。它可以輕松地實(shí)現(xiàn)半透明,、平移,、縮放等絢麗效果[1]。WPF引入了Bingding機(jī)制,,在開(kāi)發(fā)理念上進(jìn)行了一次升級(jí),,由“事件驅(qū)動(dòng)”變?yōu)椤皵?shù)據(jù)驅(qū)動(dòng)”。WPF中,,數(shù)據(jù)與空間的關(guān)系就是哲學(xué)中內(nèi)容與形式的關(guān)系,,內(nèi)容決定形式,以數(shù)據(jù)驅(qū)動(dòng)頁(yè)面,,這非常符合哲學(xué)原理[2],。
1WPF簡(jiǎn)介
1.1XAML
XAML就是WPF技術(shù)中專門用于設(shè)計(jì)UI的語(yǔ)言。XAML作為界面描述語(yǔ)言最終會(huì)被編譯成Net后臺(tái)代碼,。因此,,它能夠同后臺(tái)進(jìn)行邏輯處理的Net語(yǔ)言如C#,、C++等協(xié)同工作。XAML的產(chǎn)生使得界面描述代碼和程序代碼得以分開(kāi),,從而提高了開(kāi)發(fā)率,,有利于團(tuán)隊(duì)開(kāi)發(fā)。
1.2Data Binding機(jī)制
WPF出現(xiàn)之前,,Windows Forms等技術(shù)都是采用“事件驅(qū)動(dòng)”理念,。盡管可以使用MVC、MVP等設(shè)計(jì)模式,,但界面邏輯和業(yè)務(wù)邏輯非常容易糾纏在一起,,造成代碼復(fù)雜難懂。而B(niǎo)ingding機(jī)制可以實(shí)現(xiàn)“數(shù)據(jù)驅(qū)動(dòng)”,,當(dāng)數(shù)據(jù)發(fā)生變化時(shí),,會(huì)主動(dòng)通知界面控件、推動(dòng)控件顯示最新的數(shù)據(jù),。WPF的核心理念就是變傳統(tǒng)的UI驅(qū)動(dòng)程序?yàn)閿?shù)據(jù)驅(qū)動(dòng)UI,。
1.3依賴屬性
依賴屬性是WPF技術(shù)中新提出的概念。簡(jiǎn)而言之,,依賴屬性可以自己沒(méi)有值,,并通過(guò)使用Binding從數(shù)據(jù)源獲得值的屬性。擁有依賴屬性的對(duì)象被稱為依賴對(duì)象,。與傳統(tǒng)的CLR屬性和面向?qū)ο笏枷胂啾?,依賴屬性有很多新穎之處:首先它可以節(jié)省實(shí)例對(duì)內(nèi)存的開(kāi)銷;其次屬性值可以通過(guò)Binding依賴在其他對(duì)象上,。
2驅(qū)動(dòng)板卡檢測(cè)系統(tǒng)
2.1驅(qū)動(dòng)板卡簡(jiǎn)介
日本精工電子集團(tuán)在生產(chǎn)集裝壓電式噴頭方面已經(jīng)具備相當(dāng)雄厚的實(shí)力與基礎(chǔ),,穩(wěn)定性方面就如其生產(chǎn)的精工表一樣品質(zhì)超眾[3]。這里的驅(qū)動(dòng)板卡用于控制大型噴墨打印機(jī)的噴頭,。當(dāng)一個(gè)板卡生產(chǎn)出來(lái)時(shí),,為了檢測(cè)其性能,需要通過(guò)一個(gè)噴頭板卡檢測(cè)軟件進(jìn)行檢測(cè),。此噴頭板卡檢測(cè)軟件即為本文討論的重點(diǎn),。板卡檢測(cè)軟件與板卡通過(guò)雙絞線連接,并使用UDP協(xié)議進(jìn)行通信,。
2.2驅(qū)動(dòng)板卡通信協(xié)議
(1)驅(qū)動(dòng)板卡檢測(cè)系統(tǒng)與板卡之間采用雙絞線連接,,使用UDP通信協(xié)議進(jìn)行通信。一次完整的通信包括上位機(jī)發(fā)送命令,、下位機(jī)應(yīng)答兩部分,。其中命令具有事先約定好的格式,第一個(gè)字節(jié)BYTE0為命令I(lǐng)D,后面跟有若干個(gè)字節(jié)的參數(shù),。下位機(jī)接到命令后根據(jù)命令I(lǐng)D進(jìn)行相應(yīng)的操作并作應(yīng)答,,返回通信結(jié)果。
(2)驅(qū)動(dòng)板卡配置數(shù)據(jù)下載命令,。板卡生產(chǎn)出來(lái)后,,需要將一系列信息寫(xiě)入板卡中。此命令的命令I(lǐng)D約定為0x55,,后面跟有42 B的參數(shù)內(nèi)容,,其中包括IP地址、端口號(hào),、板卡版本號(hào),、數(shù)據(jù)寫(xiě)入時(shí)間、服務(wù)期限,、噴頭標(biāo)識(shí)碼等參數(shù),。應(yīng)答命令BYTE0為應(yīng)答ID,為0x55,。如果下載成功BYTE1為0x01,下載失敗則為0x00,。
(3)驅(qū)動(dòng)板卡配置數(shù)據(jù)讀取命令,。此命令的命令I(lǐng)D為0xAA。應(yīng)答中,,BYTE0為應(yīng)答ID,,BYTE1~BYTE42為以上提到的參數(shù)內(nèi)容。
2.3驅(qū)動(dòng)板卡檢測(cè)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
圖1為驅(qū)動(dòng)板卡檢測(cè)系統(tǒng)的界面截圖,。從圖中可以看出其主要功能,,它實(shí)現(xiàn)了數(shù)據(jù)的下載、讀取以及應(yīng)答的接收,。
(1)Net庫(kù)中的UdpClient類對(duì)基礎(chǔ)Socket進(jìn)行了封裝,,發(fā)送和接收數(shù)據(jù)時(shí)不必考慮底層套接字在收發(fā)時(shí)必須要處理的細(xì)節(jié)問(wèn)題,大大降低了UDP編程的難度,,提高了編程效率[4],。首先定義一個(gè)UdpClient對(duì)象,然后調(diào)用其Connect成員函數(shù)與遠(yuǎn)程主機(jī)進(jìn)行連接,,參數(shù)為遠(yuǎn)程主機(jī)的IP地址和端口號(hào),。再調(diào)用其Send成員函數(shù)進(jìn)行發(fā)送,函數(shù)參數(shù)為要發(fā)送的數(shù)據(jù)及其數(shù)據(jù)的長(zhǎng)度,。最后關(guān)閉UDP連接,。至此完成了一次UDP通信。
(2)數(shù)據(jù)的寫(xiě)入。此功能將獲得各個(gè)文本框中的數(shù)據(jù),。數(shù)據(jù)在文本框中的格式為字符串,,但是本系統(tǒng)需要以字節(jié)的形式通過(guò)UDP通信發(fā)送至板卡,故獲得數(shù)據(jù)后需要對(duì)數(shù)據(jù)進(jìn)一步處理再發(fā)送,。
(3)IP地址的檢測(cè),。每個(gè)驅(qū)動(dòng)板卡需要一個(gè)唯一的IP地址,因此每當(dāng)驅(qū)動(dòng)板卡檢測(cè)系統(tǒng)寫(xiě)入一個(gè)IP地址,,就要將其記錄下來(lái),,并在每次寫(xiě)入前檢測(cè)將要寫(xiě)入的IP是否可用。本系統(tǒng)將每次寫(xiě)入的IP地址存到了SQLite數(shù)據(jù)庫(kù)中,。SQLite是一款輕型的數(shù)據(jù)庫(kù),,它的設(shè)計(jì)目標(biāo)是嵌入式的,占用資源非常低,,同時(shí),,它能夠與很多程序語(yǔ)言相結(jié)合。因此本系統(tǒng)選擇了用SQLite來(lái)實(shí)現(xiàn)IP地址的存儲(chǔ),。首先打開(kāi)數(shù)據(jù)庫(kù),、建立鏈接。然后執(zhí)行SELETCT查詢語(yǔ)句查看當(dāng)前IP地址是否已經(jīng)使用,。如已使用則提示“當(dāng)前IP地址已經(jīng)使用,,請(qǐng)選用其他IP地址”,否則將當(dāng)前IP地址寫(xiě)入驅(qū)動(dòng)板卡,,并存入數(shù)據(jù)庫(kù)的IP表,。
(4)讀取當(dāng)前配置。此項(xiàng)功能實(shí)現(xiàn)較為簡(jiǎn)單,,只需要將命令I(lǐng)D 0xAA通過(guò)UDP協(xié)議發(fā)送至下位機(jī)驅(qū)動(dòng)板卡即可,,剩下的工作由下位機(jī)驅(qū)動(dòng)板卡來(lái)實(shí)現(xiàn)。驅(qū)動(dòng)板卡收到命令后,,再將由42 B組成的配置信息發(fā)送至驅(qū)動(dòng)板卡檢測(cè)系統(tǒng),。因此,上位機(jī)驅(qū)動(dòng)板卡檢測(cè)系統(tǒng)需要實(shí)現(xiàn)UDP的接收功能,。下位機(jī)隨時(shí)可能發(fā)送數(shù)據(jù)至上位機(jī),。WPF應(yīng)用程序在運(yùn)行過(guò)程中,UI線程接收輸入,,處理事件,,繪制屏幕以及運(yùn)行應(yīng)用程序代碼。如果運(yùn)行時(shí)間過(guò)長(zhǎng),,會(huì)造成內(nèi)存使用率不斷上升,,CPU占用率提高,導(dǎo)致系統(tǒng)總體性能降低[5]。因此,,UDP接收過(guò)程必須獨(dú)立使用一個(gè)線程,。
(5)多線程的應(yīng)用。多線程技術(shù)能很好地解決并發(fā)多任務(wù)問(wèn)題,,提高資源的利用率和系統(tǒng)的性能,,因此計(jì)算機(jī)的各個(gè)領(lǐng)域都對(duì)其進(jìn)行了研究,從不同角度實(shí)現(xiàn)或增強(qiáng)了對(duì)多線程的支持[6],。同時(shí)多線程技術(shù)也能提高程序的穩(wěn)定性,,因此在實(shí)際開(kāi)發(fā)中有著重要的作用。
3結(jié)論
經(jīng)過(guò)測(cè)試,,該系統(tǒng)不僅可以實(shí)現(xiàn)IP地址的寫(xiě)入,、讀取當(dāng)前配置等基本功能,而且系統(tǒng)界面與傳統(tǒng)的MFC,、WinForm等相比更加生動(dòng),、形象,更重要的是,,由于WPF框架的應(yīng)用,,提高了開(kāi)發(fā)效率,在預(yù)定時(shí)間內(nèi)完成了系統(tǒng)的開(kāi)發(fā),。
參考文獻(xiàn)
?。?] 王鵬, 崔靜. 新一代界面技術(shù)WPF的架構(gòu)及應(yīng)用[J]. 成都紡織高等專科學(xué)校學(xué)報(bào), 2011,,28(1): 1820.
[2] 劉鐵猛. 深入淺出WPF[M]. 北京:中國(guó)水利水電出版社,,2010.
?。?] 王麗坤. 常見(jiàn)噴墨打印頭的分類和性能[J]. 數(shù)字化技術(shù), 2015(7): 3941.
[4] 何波,付由甲.C#網(wǎng)絡(luò)程序開(kāi)發(fā)[M]. 北京:清華大學(xué)出版社,2014.
?。?] 蔣勇銘, 張仲貴, 呂剛. 基于WPF的LED顯示系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù), 2012, 8(5): 30683070.
?。?] 賈廣雷, 劉培玉, 耿長(zhǎng)欣. 多線程技術(shù)及其在串口通信中的應(yīng)用[J]. 計(jì)算機(jī)工程, 2003, 29(1): 247249.