基于Qt實(shí)現(xiàn)USB CDC便攜式設(shè)備串口通信客戶端設(shè)計(jì)
2.2 QT界面設(shè)計(jì)
本文引用地址:http://butianyuan.cn/article/273269.htm QT界面設(shè)計(jì)是基于C++語言開發(fā)的,類似于Windows下VC++的MFC開發(fā),而QT的界面都是功能模塊化的,開發(fā)起來更加簡潔和方便。本課題中設(shè)計(jì)的QT界面,是通過QT界面設(shè)計(jì)向?qū)Т罱ń缑婵蚣軄硗瓿傻?,界面框架MainWindow被分為四個(gè)部分:centralWidget、menuBar、mainToolBar和statusBar,添加需要的元件組件和信息內(nèi)容到各個(gè)部分,之后編寫元件之間的邏輯程序和調(diào)用通信接口函數(shù)。另外,在設(shè)計(jì)過程中使用到了類QMainWindow、類QDialog和類QFrame,這三個(gè)類是QT界面開發(fā)過程中最常用的,它們?nèi)坷^承自QWidget[6] ,如圖3所示。
3 QT串口通信的實(shí)現(xiàn)
因?yàn)樵赒T中沒有提供串口控制類,所以需要使用一個(gè)由第三方提供的QextSerialPort類來實(shí)現(xiàn)串口通信。由于QextSerialPort類提供了兩個(gè)子類:QextSerialBase類和Posix_QextSerialPort類,分別用于Windows平臺(tái)和Linux平臺(tái)運(yùn)行。這里在Linux下使用Posix_QextSerialPort類,該類關(guān)系圖如圖3所示。
可以看到,QextSerialPort類繼承自 QT 軟件自帶的QIODevice類,所以該類中的一些函數(shù)可以直接調(diào)用。其中,Posix_QextSerialPort繼承自QextSerialBase,Posix_QextSerialPort類添加了Linux平臺(tái)下操作串口的一些功能。在QextSerialBase類中涉及到一個(gè)枚舉變量QueryMode,QueryMode指的是讀取串口的方式,它提供兩個(gè)值:查詢方式Polling和事件驅(qū)動(dòng)方式EventDriven[7] 。其中,事件驅(qū)動(dòng)方式EventDriven利用事件處理串口的讀取,一旦有數(shù)據(jù)到來,就會(huì)發(fā)出readyRead信號(hào),這樣可以關(guān)聯(lián)該信號(hào)來讀取串口的數(shù)據(jù)。在此方式下,串口的讀寫是異步的,調(diào)用讀寫函數(shù)會(huì)立即返回,就不會(huì)凍結(jié)調(diào)用線程。而查詢方式Polling則不同,讀寫函數(shù)是同步執(zhí)行的,信號(hào)在這種模式下無法工作,而且有些操作也無法實(shí)現(xiàn),然而這種模式下的開銷較小。這樣就需要建立定時(shí)器來讀取串口的數(shù)據(jù)。本文介紹的就是用Polling方式來進(jìn)行串口通信,因?yàn)閘inux下串口通信僅支持此種模式。
3.2 Polling方式串口通信的實(shí)現(xiàn)過程
由于Polling方式進(jìn)行串口通信需要設(shè)置一個(gè)內(nèi)部定時(shí)器,通過QT自有的信號(hào)與槽機(jī)制,將定時(shí)器超時(shí)信號(hào)與觸發(fā)函數(shù)關(guān)聯(lián),每到定時(shí)器設(shè)定的時(shí)間后,串口就讀取一次數(shù)據(jù)或者發(fā)送一次用戶數(shù)據(jù),這里以讀操作為例進(jìn)行說明,關(guān)鍵代碼及注釋如下:
#define TIME_OUT 10 //TIME_OUT是串口讀延時(shí)
#define TIMER_INTERVAL 200 //讀取串口緩存的延時(shí)200ms
void MainWindow::startInit() //初始化
{ …
timerdly = TIMER_INTERVAL; //初始化讀取定時(shí)器間隔
timer = new QTimer(this); //設(shè)置讀取計(jì)時(shí)器
connect(timer, SIGNAL(timeout()), this, SLOT(readMyCom())); //信號(hào)和槽函數(shù)關(guān)聯(lián),延時(shí)10ms,進(jìn)行讀串口操作
}
void MainWindow::on_Open_triggered() //打開串口
{ …
myCom = new Posix_QextSerialPort(“/dev/ACM0″, QextSerialBase::Polling); //這里采用Polling方式,設(shè)備為CDC類下的ACM0
timer->start(timerdly); //開啟讀取定時(shí)器
myCom->setTimeout(TIME_OUT); //設(shè)置延時(shí)
}
具體串口通信的流程圖如圖4所示。
3.3 QT串口通信在Linux下的實(shí)現(xiàn)
在熟知QT下串口通信的原理后,在QT軟件中建立工程,通過調(diào)用QextSerialBase和Posix_QextSerialPort兩個(gè)類,利用Textbrowser、Label和Button等元件函數(shù)來實(shí)現(xiàn)QT界面的編寫,在PC機(jī)上調(diào)試Debug版本,調(diào)試成功后,可以發(fā)布Release版本,運(yùn)行效果如圖5、6所示。至此,上位機(jī)Linux系統(tǒng)的圖形界面就設(shè)計(jì)完成了,也可根據(jù)自己的需要和使用習(xí)慣來設(shè)計(jì)圖形用戶界面,以達(dá)到最大的美觀效果和便捷性。
4 結(jié)語
文章介紹了實(shí)現(xiàn)USB CDC類設(shè)備通信實(shí)現(xiàn)和制作QT串口通信界面的方法。該方法簡單,可靠,易學(xué),并且成本低廉。同時(shí),本驅(qū)動(dòng)軟件在Linux 2.6內(nèi)核版本下通過了專業(yè)的測試和驗(yàn)證,并應(yīng)用到公達(dá)數(shù)碼的POS58和POS80等型號(hào)的打印機(jī)產(chǎn)品中,該公司使用本驅(qū)動(dòng)軟件的打印機(jī)產(chǎn)品已廣泛地應(yīng)用在餐飲行業(yè)及其他領(lǐng)域。另一方面,由于Linux系統(tǒng)和QT軟件均具有較強(qiáng)的可移植性,可以將本界面程序移植到手持設(shè)備端,這樣將會(huì)有更加廣闊的市場前景。
參考文獻(xiàn):
[1]李英偉,王成儒,練秋生,等.USB2.0原理與工程開發(fā)(第二版)[M].北京:國防工業(yè)出版社,2007
[2]張弘.USB接口設(shè)計(jì)[M].西安:西安電子科技大學(xué)出版社,2002
[3]郝瑩,孫宏軍.基于CDC協(xié)議的儀表通用USB接口設(shè)計(jì)[C]. 第25屆中國控制與決策會(huì)議論文集,2013.05
[4]吳明琪,馬潮.嵌入式系統(tǒng)的USB虛擬串口設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2005.(04):62-63+66
[5]www.usb.org,USB Class Definitions for Communication Devices[J], Revision 1.2 2007
[6]霍亞飛.QT Creator 快速入門[M].北京:北京航空航天大學(xué)出版社,2012
[7]劉依晗,丑武勝,董明杰.基于QT/E串口通信的手持監(jiān)控器[M].現(xiàn)代電子技術(shù),2013,36(20):110-112
[8]霍亞飛.Qt及Qt Quick開發(fā)實(shí)戰(zhàn)精解[M].北京:北京航空航天大學(xué)出版社,2012
[9]溫卡特斯瓦蘭 著,宋寶華 等譯.精通Linux設(shè)備驅(qū)動(dòng)程序開發(fā)[M].北京:人民郵電出版社,2010
[10]Jonathan Corbet, Greg Kroah-Hartman, Alessandro Rubini. Linux Device Drivers[J], 3rd Edition.O'Reilly,2005.02
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
c++相關(guān)文章:c++教程
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
評(píng)論