胡軍鋒 尤澤萌
(山東省海洋環(huán)境監(jiān)測(cè)技術(shù)重點(diǎn)實(shí)驗(yàn)室 山東省科學(xué)院海洋儀器儀表研究所,山東 青島 266001)
嵌入式操作系統(tǒng)異軍突起,在工業(yè)監(jiān)測(cè)、智能家電、軍用等各個(gè)領(lǐng)域中應(yīng)用越來(lái)越廣泛。嵌入式操作系統(tǒng)目前比較流行的就是Linux 與WinCE。由于WinCE 為微軟開(kāi)發(fā),代碼不公開(kāi),使用上移植行就比較差,并且收費(fèi)。而Linux 內(nèi)核代碼是完全開(kāi)源的,免費(fèi)使用,其代碼方便移植、安全性高、穩(wěn)定性好、效率高,同時(shí)支持嵌入式CPU,如POWERPC、ARM、X86、MIPS 等,故得到廣泛的應(yīng)用。嵌入式Linux 中圖形開(kāi)發(fā)軟件主要有Qt[1]與MiniGui[2]。前者是基于C++后者是基于C的。使用Qt 開(kāi)發(fā)的軟件,相同的程序代碼可以在任何支持的平臺(tái)上編譯與運(yùn)行,無(wú)需修改源代碼。Qt 可用于各種類(lèi)型的設(shè)備和產(chǎn)品,從智能電器(移動(dòng)電話(huà)、路由器和機(jī)頂盒)到工業(yè)控制設(shè)備(如醫(yī)學(xué)成像設(shè)備、移動(dòng)信息系統(tǒng)等)。MiniGui 最初是用于工控設(shè)計(jì)的,其小巧、高效率特點(diǎn)適合于簡(jiǎn)單界面界面開(kāi)發(fā)。
本文介紹的基于嵌入式操作系統(tǒng)的氣象監(jiān)測(cè)系統(tǒng)使用的是嵌入式UBUNTU 系統(tǒng),移植了當(dāng)前最流行的圖形化開(kāi)發(fā)軟件Qt4。系統(tǒng)需要同時(shí)監(jiān)測(cè)各種氣象要素,如風(fēng)速、風(fēng)向、溫濕度、氣壓、能見(jiàn)度、降雨量、太陽(yáng)輻射度等等氣象參數(shù)。每個(gè)氣象參數(shù)一般對(duì)應(yīng)著一種智能傳感器,這種智能傳感器很多都是具備串口通訊的。目前Qt4 之前版本中有關(guān)串口通訊類(lèi)軟件還沒(méi)有,比較常用的是第三方的串口類(lèi)軟件和創(chuàng)建常駐線(xiàn)程的方式來(lái)實(shí)現(xiàn)。第一種方式問(wèn)題就是移植起來(lái)比較復(fù)雜。第二種方法需要程序員對(duì)于內(nèi)核調(diào)度有深入了解,否則在使用線(xiàn)程的時(shí)候容易造成系統(tǒng)崩潰。所有鑒于上述情況本文介紹使用QSocketNotifier 類(lèi)來(lái)監(jiān)聽(tīng)來(lái)自文件的數(shù)據(jù),實(shí)現(xiàn)串口編程。QSocketNotifier 類(lèi)封裝了Linux 內(nèi)核對(duì)于底層端口的操作,使得用戶(hù)不需要去了解底層的各種的結(jié)構(gòu)體,是程序開(kāi)發(fā)變得更加容易,更易理解。
Linux 中所有的外設(shè)都被定義為某個(gè)文件,對(duì)外設(shè)的操作也就是對(duì)于其文件進(jìn)行相應(yīng)的讀寫(xiě)操作,所以對(duì)于串口操作也是對(duì)于相應(yīng)的文件進(jìn)行操作。QSocketNotifier 類(lèi)對(duì)應(yīng)三類(lèi)事件:QSocketNotifier::Read,QSocketNotifier::Write,QSocketNotifier::Exception。由于采集來(lái)自串口的數(shù)據(jù),這里只使用QSocketNotifier::Read 事件。每個(gè)QSocketNotifier 對(duì)象只對(duì)應(yīng)著一個(gè)監(jiān)聽(tīng)事件,如果需要監(jiān)聽(tīng)多個(gè)事件,那么就要?jiǎng)?chuàng)建相應(yīng)的QSocketNotifier 對(duì)象。與傳統(tǒng)的線(xiàn)程方式相比,大大簡(jiǎn)化了程序代碼,由于與操作系統(tǒng)完全隔離,使得程序更加穩(wěn)定。假設(shè)需要檢測(cè)來(lái)自風(fēng)傳感器、溫濕度傳感器和壓力傳感器的數(shù)據(jù)。那么我們需要?jiǎng)?chuàng)建三個(gè)單獨(dú)QSocketNotifier 對(duì)象,通過(guò)相應(yīng)的Qt 事件信號(hào)機(jī)制來(lái)實(shí)現(xiàn)。
圖1 軟件流程圖
首先系統(tǒng)初始化打開(kāi)溫濕度、大氣壓力和風(fēng)傳感器對(duì)應(yīng)的串口文件,同時(shí)設(shè)置文件通訊波特率。然后創(chuàng)建3 個(gè)QSocketNotifier 對(duì)象,分別用來(lái)監(jiān)控來(lái)自溫濕度、大氣壓力和風(fēng)傳感器信號(hào),當(dāng)監(jiān)聽(tīng)到某個(gè)文件有數(shù)據(jù)傳來(lái),先判斷是否是鍵盤(pán)等其他事件,如果是則進(jìn)入相應(yīng)的鍵盤(pán)及其他事件處理函數(shù)。判斷是否是串口事件,如果是其對(duì)應(yīng)的QSocketNotifier 就會(huì)發(fā)射ativated 信號(hào),然后進(jìn)入相應(yīng)的slot 處理。使用QSocketNotif 類(lèi)最大好處是讓程序開(kāi)發(fā)者不用去詳細(xì)了解Linux 操作系統(tǒng)后臺(tái)是如何處理串口數(shù)據(jù)的,只要有數(shù)據(jù)來(lái)就會(huì)觸發(fā)ativated信號(hào),進(jìn)入每個(gè)串口所對(duì)應(yīng)的函數(shù)操槽去處理。如果沒(méi)有事件發(fā)生,系統(tǒng)繼續(xù)等待事件的發(fā)生。
第一步:打開(kāi)大氣壓力、溫濕度、風(fēng)傳感器對(duì)應(yīng)的文件,設(shè)置相關(guān)波特率。
第二步:為每一個(gè)需要監(jiān)聽(tīng)的串口創(chuàng)建QSocketNotifier 對(duì)象。如下所示
本文簡(jiǎn)要介紹了基于QSocketNotifier 的串口監(jiān)聽(tīng)方式,這種方式相比起第三方串口類(lèi),其編程比較簡(jiǎn)單,易于初學(xué)者使用。缺點(diǎn)就是Qt3.0 以前版本中沒(méi)有QSocketNotifier 類(lèi),只有Qt4.0 以后的版本才有。
[1]姚福鵬.嵌入式數(shù)據(jù)庫(kù)在QT/中的應(yīng)用與研究[J].國(guó)外電子測(cè)量技術(shù),2010,9:73-79.
[2]張升,陶維青,黃林.嵌入式圖形開(kāi)發(fā)界面MinuGui[J].儀器儀表用戶(hù),2013,2.