<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 基于Qt實(shí)現USB CDC便攜式設備串口通信客戶(hù)端設計

基于Qt實(shí)現USB CDC便攜式設備串口通信客戶(hù)端設計

作者:張熹 時(shí)間:2015-05-14 來(lái)源:電子產(chǎn)品世界 收藏
編者按:為實(shí)現上位機Linux系統的Qt應用程序與下位機USB CDC便攜式設備之間的串口通信,本課題采用USB CDC類(lèi)協(xié)議,并根據協(xié)議在Linux下編寫(xiě)設備驅動(dòng)程序,同時(shí),搭建Linux-QT應用平臺利用QT可視化的圖形界面及豐富的圖形庫,設計并制作上位機應用程序圖形界面,并根據Linux下串口通信的應用層協(xié)議,最終實(shí)現了在QT界面上實(shí)時(shí)顯示便攜式設備的數據、狀態(tài)和控制便攜式設備。該方法簡(jiǎn)單、可靠、便于實(shí)際工程應用,解決了安裝有Linux操作系統的上位機用戶(hù)與便攜式設備通信不方便的問(wèn)題。因此,本課題對USB

2.2 界面設計

本文引用地址:http://dyxdggzs.com/article/273269.htm

  界面設計是基于C++語(yǔ)言開(kāi)發(fā)的,類(lèi)似于Windows下VC++的MFC開(kāi)發(fā),而的界面都是功能模塊化的,開(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í)現

3.1 的原理

  因為在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平臺和平臺運行。這里在下使用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方式,設備為類(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 類(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]郝瑩,孫宏軍.基于協(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)文章:通信原理



上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>