• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      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è)控制項目當中經(jīng)常使用Qt/Embedded類庫開發(fā)界面控制應(yīng)用程序,作為應(yīng)用控制端一般使用RS232總線與控制設(shè)備進行通信,但是在Qt/ Embedded類庫中沒有提供串口的基礎(chǔ)類,這就需要在項目應(yīng)用中編寫基于Qt/Embedded的串口基礎(chǔ)類。本文對基于Qt/Embedded的串口基礎(chǔ)類進行類定義及應(yīng)用測試。

      1 Qt/Embedded簡介[1]

      Qt/Embedded是Trolltech公司開發(fā)的面向嵌入式系統(tǒng)的Qt版本,與X11版本的Qt在最大程度上接口兼容,采用幀緩存(framebuffer)作為底層圖形接口。Qt/Embedded類庫完全采用C++封裝,并且有著豐富的控件資源以及較好的可移植性,大范圍的Qt/Embedded API可用于多種開發(fā)項目。在工業(yè)控制項目當中會使用大量的串口通信,但是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)用的簡化版本,為運行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支持鼠標、鍵盤、觸摸屏和網(wǎng)絡(luò)等輸入輸出接口,但是不具有串口基礎(chǔ)類。

      在Qt中,對象間通過信號和槽的機制實現(xiàn)彼此通信。信號/槽機制是Qt的核心機制,是一種高級接口,主要應(yīng)用于對象之間的通信。Qt的信號/槽機制獨立于標準的C/C++語言。在Qt中,從QObject或其子類(例如Qwidget)派生的類可擁有自己的信號和槽。當對象改變其狀態(tài)時,信號就由該對象發(fā)射出去,從而實現(xiàn)了信息封裝,以確保對象被當作軟件組件來使用。槽用于接收信號,體現(xiàn)為普通的對象成員函數(shù)的形式。槽和信號的連接由程序設(shè)計者完成,只有當設(shè)計者利用connect()將信號和槽連接起來后,信號和槽之間才會有上述的通信。信號和槽的機制使得各個對象之間的協(xié)同工作變得十分簡單,在本串口類設(shè)計中就使用了Qt的信號和槽的機制(見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標準C語言類庫,可以在Qt/Embedded應(yīng)用程序中使用Linux標準C語言類庫對串口進行操作。

      圖2 Qt/Embedded操作結(jié)構(gòu)圖

      3 串口類的設(shè)計

      C語言對硬件的操作一般使用阻塞讀取和查詢的方法讀取數(shù)據(jù),而在Qt/Embedded中使用信號與槽無阻塞操作。因此要在Qt/Embedded中高效的運行程序,必須把對串口的操作設(shè)計成無阻塞操作[3]。在Qt的串口類設(shè)計中,串口傳輸?shù)牟铄e控制由硬件來保證;而緩沖區(qū)的溢出根據(jù)應(yī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()對變量進行初始化,析構(gòu)函數(shù)~QSerial()關(guān)閉套接字。串口的初始化主要工作流程圖如圖5所示。

      圖5 串口的初始化主要工作流程圖

      初始化成功后可以產(chǎn)生一個套接字,并返回一個正確碼。配置串口的過程主要有以下步驟。

      1)調(diào)用openDev()函數(shù)打開串口設(shè)備,設(shè)備名可以從參數(shù)傳遞,打開設(shè)備成功后進行下一步,如果打開設(shè)備失敗返回錯誤碼;

      2)調(diào)用setSpeed()函數(shù)設(shè)置串口波特率;

      3)調(diào)用setParity函數(shù)設(shè)備奇偶校驗,如果設(shè)置成功返回正確碼,如果不成功返回錯誤碼。

      信號 readyRead()由槽 dataRead()觸發(fā),而dataRead()連接在QSocketNotifier上,當設(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)體進行串口設(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()串口類,完成了顯示終端與下位機通信的串口通信。圖6是車載顯示終端主界面,可以實現(xiàn)的工作主要包括:1)刷新數(shù)據(jù)顯示:需要刷新的數(shù)據(jù)包括速度、限速、信號機編號和類型、距信號機距離、時間等;2)刷新狀態(tài)指示顯示:包括當前色燈以及屏幕右邊的各種狀態(tài)指示;3)刷新圖形顯示:根據(jù)當前的數(shù)據(jù),畫出前方4 km和后方1 km的速度、限速曲線以及平縱斷面和道橋隧等。4)車輛位置顯示:主界面左側(cè)約1/5處有一條垂直分割線,表示此處為當前機車位置。

      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].北京:機械工業(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é)探索
      計算機教育(2020年5期)2020-07-24 08:52:56
      用Java編寫客戶機/服務(wù)器端應(yīng)用程序
      Python在數(shù)據(jù)可視化中的應(yīng)用
      基于C語言的計算機軟件編程
      電子制作(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)用
      宁城县| 万山特区| 闸北区| 凤山市| 南开区| 荔波县| 舞阳县| 云龙县| 晋中市| 油尖旺区| 怀化市| 昌黎县| 台北县| 石棉县| 福安市| 浙江省| 东城区| 彰化市| 荆州市| 响水县| 晋中市| 甘南县| 南华县| 南投县| 天全县| 北川| 利川市| 灵川县| 元阳县| 南昌市| 徐闻县| 慈溪市| 孟连| 颍上县| 平武县| 宁乡县| 清涧县| 桦川县| 绥宁县| 张家界市| 保德县|