陳旭紅,高文學(xué)
(1.湖北汽車工業(yè)學(xué)院,湖北 十堰 442002;2.陜西廣播電影電視局,陜西 延安 716000)
Qt/Embedded串口類的設(shè)計及應(yīng)用
陳旭紅1,高文學(xué)2
(1.湖北汽車工業(yè)學(xué)院,湖北 十堰 442002;2.陜西廣播電影電視局,陜西 延安 716000)
針對Qt/Embedded類中沒有提供串口基礎(chǔ)類的現(xiàn)狀,研究了Qt/Embedded與串口信息交互的方法,并給出了Qt/Embedded串口類的實現(xiàn)及Qt/Embedded串口類在工業(yè)控制中的應(yīng)用實例。
Qt/Embedded;串口;信息交互
在工業(yè)控制項目當(dāng)中經(jīng)常使用Qt/Embedded類庫開發(fā)界面控制應(yīng)用程序,作為應(yīng)用控制端一般使用RS232總線與控制設(shè)備進(jìn)行通信,但是在Qt/ Embedded類庫中沒有提供串口的基礎(chǔ)類,這就需要在項目應(yīng)用中編寫基于Qt/Embedded的串口基礎(chǔ)類。本文對基于Qt/Embedded的串口基礎(chǔ)類進(jìn)行類定義及應(yīng)用測試。
Qt/Embedded是Trolltech公司開發(fā)的面向嵌入式系統(tǒng)的Qt版本,與X11版本的Qt在最大程度上接口兼容,采用幀緩存(framebuffer)作為底層圖形接口。Qt/Embedded類庫完全采用C++封裝,并且有著豐富的控件資源以及較好的可移植性,大范圍的Qt/Embedded API可用于多種開發(fā)項目。在工業(yè)控制項目當(dāng)中會使用大量的串口通信,但是Qt/ Embedded沒有提供與串口硬件的接口。
Qt/Embedded的底層圖形引擎基于 framebuffer。framebuffer是一種驅(qū)動程序接口,它將顯示設(shè)備抽象為幀緩沖區(qū)。該驅(qū)動程序的設(shè)備文件一般是/dev/fb0、/dev/fb1等。對用戶而言,它和/dev下的其他設(shè)備沒有什么區(qū)別,用戶可以把framebuffer看成一塊內(nèi)存,既可以從這塊內(nèi)存中讀取數(shù)據(jù),也可以向其中寫入數(shù)據(jù),而寫操作立即反應(yīng)在屏幕上。Qt/Embedded是 Qt的面向嵌入式應(yīng)用的簡化版本,為運(yùn)行Qt/Embedded,嵌入式Linux內(nèi)核要支持framebuffer。
它包括一組完備的GUI類、操作系統(tǒng)封裝、數(shù)據(jù)結(jié)構(gòu)類、功能類和組合類。大部分Qt的應(yīng)用程序可以經(jīng)過簡單的編譯與重設(shè)窗口大小移植到Qt/ Embedded。Qt/Embedded的實現(xiàn)結(jié)構(gòu)如圖1所示。
圖1 Qt/Embedded實現(xiàn)結(jié)構(gòu)圖
從Qt/Embedded的結(jié)構(gòu)中可以看出,Qt/Embedded支持鼠標(biāo)、鍵盤、觸摸屏和網(wǎng)絡(luò)等輸入輸出接口,但是不具有串口基礎(chǔ)類。
在Qt中,對象間通過信號和槽的機(jī)制實現(xiàn)彼此通信。信號/槽機(jī)制是Qt的核心機(jī)制,是一種高級接口,主要應(yīng)用于對象之間的通信。Qt的信號/槽機(jī)制獨立于標(biāo)準(zhǔn)的C/C++語言。在Qt中,從QObject或其子類(例如Qwidget)派生的類可擁有自己的信號和槽。當(dāng)對象改變其狀態(tài)時,信號就由該對象發(fā)射出去,從而實現(xiàn)了信息封裝,以確保對象被當(dāng)作軟件組件來使用。槽用于接收信號,體現(xiàn)為普通的對象成員函數(shù)的形式。槽和信號的連接由程序設(shè)計者完成,只有當(dāng)設(shè)計者利用connect()將信號和槽連接起來后,信號和槽之間才會有上述的通信。信號和槽的機(jī)制使得各個對象之間的協(xié)同工作變得十分簡單,在本串口類設(shè)計中就使用了Qt的信號和槽的機(jī)制(見3.3節(jié))。
在Qt/Embedded 2.3.10在開發(fā)中使用Linux作為操作系統(tǒng),Linux操作系統(tǒng)對網(wǎng)絡(luò)和硬件操作都具有很好的支持。
Qt/Embedded對網(wǎng)絡(luò)具有良好的支持,而Linux下的C語言對網(wǎng)絡(luò)和硬件都有很好的支持,因此可以使用C語言建立TCP Server,Qt/Embedded使用網(wǎng)絡(luò)接口與TCP Server連接,通過C語言的串口操作來完成Qt/Embedded對串口的操作[2]。其操作結(jié)構(gòu)圖如圖2所示。
此方法比較復(fù)雜,需要定義內(nèi)部通信協(xié)議,故一般不使用這種方法。
Qt/Embedded類庫完全采用C++封裝,但是支持使用Linux標(biāo)準(zhǔn)C語言類庫,可以在Qt/Embedded應(yīng)用程序中使用Linux標(biāo)準(zhǔn)C語言類庫對串口進(jìn)行操作。
圖2 Qt/Embedded操作結(jié)構(gòu)圖
C語言對硬件的操作一般使用阻塞讀取和查詢的方法讀取數(shù)據(jù),而在Qt/Embedded中使用信號與槽無阻塞操作。因此要在Qt/Embedded中高效的運(yùn)行程序,必須把對串口的操作設(shè)計成無阻塞操作[3]。在Qt的串口類設(shè)計中,串口傳輸?shù)牟铄e控制由硬件來保證;而緩沖區(qū)的溢出根據(jù)應(yīng)用而定,當(dāng)檢測到緩沖不足時,按照一定的比例自動增大緩沖區(qū),從而避免了緩沖區(qū)溢出。
要把串口類設(shè)計成無阻塞操作的類,就必須像Qt/Embedded中QSocket類一樣提供void QSocket:: readyRead()信號供應(yīng)用程序使用,以讀取信息。為了類似實現(xiàn)void QSocket::readyRead()信號,可以借助QSocketNotifier類。在Qt/Embedded 2.3.10版本中QSocketNotifier支持對所有套接字的回調(diào),QSocketNotifier支持對設(shè)備的讀、寫和錯誤狀態(tài)的回調(diào)。其原型為
圖3 QSerialSt定義圖
為更加方便設(shè)置串口參數(shù),定義了串口參數(shù)結(jié)構(gòu)體QSerialSt,QSerialSt定義如圖3所示。
QSerial類的結(jié)構(gòu)如圖4所示,串口配置主要由init()函數(shù)傳遞的串口參數(shù)結(jié)構(gòu)體QSerialSt來完成。QSerial類的寫串口可以調(diào)用writeBlock()函數(shù),信息讀取可以使用readyRead()信號。
圖4 QSerial類的結(jié)構(gòu)圖
QSerial的構(gòu)造函數(shù)QSerial()對變量進(jìn)行初始化,析構(gòu)函數(shù)~QSerial()關(guān)閉套接字。串口的初始化主要工作流程圖如圖5所示。
圖5 串口的初始化主要工作流程圖
初始化成功后可以產(chǎn)生一個套接字,并返回一個正確碼。配置串口的過程主要有以下步驟。
1)調(diào)用openDev()函數(shù)打開串口設(shè)備,設(shè)備名可以從參數(shù)傳遞,打開設(shè)備成功后進(jìn)行下一步,如果打開設(shè)備失敗返回錯誤碼;
2)調(diào)用setSpeed()函數(shù)設(shè)置串口波特率;
3)調(diào)用setParity函數(shù)設(shè)備奇偶校驗,如果設(shè)置成功返回正確碼,如果不成功返回錯誤碼。
信號 readyRead()由槽 dataRead()觸發(fā),而dataRead()連接在QSocketNotifier上,當(dāng)設(shè)備有數(shù)據(jù)可讀時會回調(diào)dataRead()函數(shù)讀取數(shù)據(jù)并觸發(fā)信號readyRead(),通知上層讀取數(shù)據(jù)。代碼如下:
1)初始化QSerialSt結(jié)構(gòu)體,設(shè)置串口信息。
2)調(diào)用init()函數(shù)傳遞初始化好的QSerialSt結(jié)構(gòu)體進(jìn)行串口設(shè)置,檢測返回值判斷初始化是否成功,并做相應(yīng)的處理。
3)初始化成功后調(diào)用setNotifier()函數(shù),設(shè)置串口回調(diào)函數(shù)。
4)連接QSerial類的readyRead()信號,供應(yīng)用類讀取數(shù)據(jù)。
圖6 車載顯示終端主界面
車載顯示終端中使用QSerial()串口類,完成了顯示終端與下位機(jī)通信的串口通信。圖6是車載顯示終端主界面,可以實現(xiàn)的工作主要包括:1)刷新數(shù)據(jù)顯示:需要刷新的數(shù)據(jù)包括速度、限速、信號機(jī)編號和類型、距信號機(jī)距離、時間等;2)刷新狀態(tài)指示顯示:包括當(dāng)前色燈以及屏幕右邊的各種狀態(tài)指示;3)刷新圖形顯示:根據(jù)當(dāng)前的數(shù)據(jù),畫出前方4 km和后方1 km的速度、限速曲線以及平縱斷面和道橋隧等。4)車輛位置顯示:主界面左側(cè)約1/5處有一條垂直分割線,表示此處為當(dāng)前機(jī)車位置。
本文定義的QSerial類具有易于使用、占用較少的CPU資源、接口規(guī)范、串口配置過程簡單和數(shù)據(jù)讀取容易等特點。QSerial類已在多個工業(yè)控制項目中使用,經(jīng)過反復(fù)的實驗測試,QSerial類在Linux 2.6.21內(nèi)核和Qt/Embedded 2.3.10的環(huán)境下能夠長時間穩(wěn)定工作。
[1]QT2.3白皮書[EB/OL].[2010-10-28].http://www.trolltech.com.
[2]于明儉,陳向陽,方 漢.LINUX程序設(shè)計權(quán)威指南[M].北京:機(jī)械工業(yè)出版社,2001.
[3]袁鵬飛.24小時學(xué)通qt編程[M].北京:人民郵電出版社,2000.
Design and Application of Qt/Embedded Serial Port Class
Chen Xuhong1,Gao Wenxue2
(1.Hubei Automotive Industries Institute,Shiyan 442002,China;2.Radio Film&TV Bureau of Shaanxi Province,Yan’an 716000,China)
The information interaction between Qt/Embedded and serial port was studied.The serial port class was realized in Qt/Embedded.An applying example of the serial port class in the industrial control was given.
Qt/Embedded;serial port;information interaction
TN316.2
A
1008-5483(2010)04-0051-03
10.3969/j.issn.1008-5483.2010.04.013
2010-10-28
陳旭紅(1970-),男,湖北應(yīng)城人,碩士,從事電子技術(shù)方面的研究。