国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Qt/Embedded串口類的設(shè)計及應(yīng)用

2010-03-03 03:31:16陳旭紅高文學(xué)
關(guān)鍵詞:類庫緩沖區(qū)C語言

陳旭紅,高文學(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)用測試。

1 Qt/Embedded簡介[1]

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é))。

2 Qt/Embedded使用串口的方法

在Qt/Embedded 2.3.10在開發(fā)中使用Linux作為操作系統(tǒng),Linux操作系統(tǒng)對網(wǎng)絡(luò)和硬件操作都具有很好的支持。

2.1 使用Qt/Embedded和C語言操作串口

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é)議,故一般不使用這種方法。

2.2 使用Qt/Embedded直接操作

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)圖

3 串口類的設(shè)計

C語言對硬件的操作一般使用阻塞讀取和查詢的方法讀取數(shù)據(jù),而在Qt/Embedded中使用信號與槽無阻塞操作。因此要在Qt/Embedded中高效的運(yùn)行程序,必須把對串口的操作設(shè)計成無阻塞操作[3]。在Qt的串口類設(shè)計中,串口傳輸?shù)牟铄e控制由硬件來保證;而緩沖區(qū)的溢出根據(jù)應(yīng)用而定,當(dāng)檢測到緩沖不足時,按照一定的比例自動增大緩沖區(qū),從而避免了緩沖區(qū)溢出。

3.1 設(shè)計分析

要把串口類設(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.2 類的定義

圖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)圖

3.3 類的實現(xiàn)

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ù)。代碼如下:

4 應(yīng) 用

4.1 使用QSerial類的主要步驟

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ù)。

4.2 QSerial類應(yīng)用示例代碼

4.3 QSerial類應(yīng)用實例

圖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ī)車位置。

5 總 結(jié)

本文定義的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ù)方面的研究。

猜你喜歡
類庫緩沖區(qū)C語言
嵌入式系統(tǒng)環(huán)形緩沖區(qū)快速讀寫方法的設(shè)計與實現(xiàn)
基于Visual Studio Code的C語言程序設(shè)計實踐教學(xué)探索
用Java編寫客戶機(jī)/服務(wù)器端應(yīng)用程序
Python在數(shù)據(jù)可視化中的應(yīng)用
基于C語言的計算機(jī)軟件編程
電子制作(2018年16期)2018-09-26 03:27:08
數(shù)據(jù)結(jié)構(gòu)課程教學(xué)改革方案和應(yīng)用效果
軟件工程(2017年12期)2018-01-29 17:35:55
數(shù)據(jù)結(jié)構(gòu)可視化類庫的設(shè)計與實現(xiàn)
高職高專院校C語言程序設(shè)計教學(xué)改革探索
關(guān)鍵鏈技術(shù)緩沖區(qū)的確定方法研究
論子函數(shù)在C語言數(shù)據(jù)格式輸出中的應(yīng)用
海安县| 福清市| 太原市| 濮阳市| 文成县| 龙岩市| 泰安市| 台中市| 德钦县| 玉环县| 楚雄市| 潞城市| 建始县| 岗巴县| 绥中县| 普安县| 屏东县| 武强县| 舒兰市| 保康县| 崇文区| 诸暨市| 衡水市| 宁武县| 萨嘎县| 德州市| 无棣县| 普洱| 垫江县| 东明县| 甘德县| 当涂县| 翁牛特旗| 贵州省| 宜兴市| 桐柏县| 武强县| 沈阳市| 砚山县| 昭平县| 安西县|