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