



摘要:為實現上位機Linux系統的Qt應用程序與下位機USB CDC便攜式設備之間的串口通信,本課題采用USB CDC類協議,并根據協議在Linux下編寫設備驅動程序,同時,搭建Linux-QT應用平臺利用QT可視化的圖形界面及豐富的圖形庫,設計并制作上位機應用程序圖形界面,并根據Linux下串口通信的應用層協議,最終實現了在QT界面上實時顯示便攜式設備的數據、狀態和控制便攜式設備。該方法簡單、可靠、便于實際工程應用,解決了安裝有Linux操作系統的上位機用戶與便攜式設備通信不方便的問題。因此,本課題對USB CDC便攜式設備用戶來說將有廣闊的應用前景。本文網絡版地址:http://www.eepw.coni.cn/article/273269.htm
關鍵詞:CDC;Linux;便攜式設備;QT;串口通信DOI:10.3969/j.issn.1005-5517.2015.4.010
引言
近年來,隨著電子科技的進步和高新技術的不斷涌現,不少設備的技術性能越來越好,體積也越來越小,易于搬運和攜帶。具有USB接口的便攜式設備已經走進了人們的生活。在眾多USB產品中,有這樣一類USB設備廣泛應用于我們的生產和生活中 一使用USB CDC類協議的設備,然而對于Lin ux下使用此類設備的用
戶來講,幾乎不可
用的。因此,需要根據CDC類通信協議編寫設備驅動程序,以使用戶實現與USB CDC類設備的數據通信。同時,在上位機環境下,利用QT軟件設計實現CDC類設備串口通信應用程序,這樣用戶就可以輕松、方便地監視設備的當前狀態和控制設備行為。
另外,Linux是一個完全免費和基于UNIX和POSIX的用戶、多任務、支持多進程線程和多核的操作系統,它具有完全兼容PO SIXl.0標準、良好的界面、獨特的組織架構等特點。尤其是它配以擁有多種應用庫的QT軟件,使得本CDC類設備串口通信應用程序設計簡單,成本低廉,非常適合于推廣和應用。1USB和USB CDC協議
1.1 USB接口簡介
通用串行總線(Universal SerialBus,簡稱USB)是計算機連接外部設備裝置的一個高速串行通信協議標準,如今USB2.0已廣泛地應用在計算機上,同時也擴展到了家用機頂盒和游戲機上。另外,補充標準On-The-Go(OTG)使USB設備間能夠獨立地進行數據交換。USB的出現大大簡化了計算機和其它設備的數據通信,增強了計算機的擴展性,因而得到大范圍推廣。
通信接口是便攜式設備必備的對外功能模塊之一。由于現今設備的多功能特點,造成數據傳送量呈幾何級數地增加,過去的通信協議標準如串口通信協議RS-232、并行通信接口協議LPT等存在傳輸速度低、誤碼率高、數據常常丟失等問題,已不能滿足社會發展的需求。可以看出,USB接口在便攜式設備上出現是一種必然趨勢。
1.2 CDC類簡介
USB通訊協議組織制定了三個類:通信設備類、通信接口類和數據接口類。通訊設備類是一種設備級別的定義,主機用該協議識別外部設備可以表現出的不同接口類型。通信接口類定義了一種可以使能USB上的所有類型的通信服務的通用機制。數據接口類定義了一種通用機制,當數據不能滿足其它通信類的要求時,能使USB完成塊數據或者同步傳輸功能。其中,USB CDC類是由通信接口類和數據接口類組合而成。針對不同的USB通信設備,CDC類又被分成以下三個模式:傳統純電話業務模式、ISDN模式和網絡模式。而傳統純電話業務模式可分為Direct Line ControlModel. ACM(Abstract ControlModel)和USBTelephone Model。本文所討論的便攜式設備串口通信就屬于USB傳統純電話業務下的ACM模式。
1.3 CDC類協議通信原理和接口函數
USB CDC類協議所描述的USBCDC類設備首先像一般的USB設備被USB Core所識別和描述,其次將信息上傳至更高層協議,也就是tty協議層,最后通過線路規程的方式,將tty協議層和usb協議層結合使用,完成CDC類設備通信,即tty協議層負責應用程序串口通信,usb協議層負責CDC類設備的識別、描述和通信,如圖l所示。
本文中開發的設備驅動涉及的主要接口函數和過程如下:首先,當CDC類設備接入USB接口時,利用初始化函數acm_init (void)初始化設備,再由探針函數acm_probe()對接入的設備識別檢測;其次,設備控制中斷函數acm_ctrl_irq()發出中斷,請求數據讀寫,其中數據讀寫函數為:批量塊傳輸讀函數acm—read—bulk()、批量塊傳輸寫函數acmwrite_bulk();再次,打開tty協議層設備,并進行數據通信,主要是以下五個函數:打開tty設備函數acmtty_open()、關閉函數acm_tty_close()、寫函數acm_tty_write()、中斷控制函數acm_tty_break_ctl()和IO控制函數acm_tty_ioctl();最后,需要有設備驅動的銷毀和退出函數;acm_disconnect()、acm—exit(void)。
2 QT軟件介紹及其界面設計
2.1 QT軟件簡介
Qt是1991年由奇趣科技開發的一個跨平臺C++圖形用戶界面應用程序開發框架,它提供給應用程序開發者建立藝術級的圖形用戶界面所需的所有功能。因此,Qt的擴展性極強,允許多組件或模塊化編程。同時,Qt的跨平臺特性好,支持任何平臺的編譯與運行。另外,其獨有的信號和槽機制,使得觸發信號和數據在不同模塊間通信。可以看出,QT是專門面向用戶對象的,提供了圖形用戶界面的應用框架和窗口系統,具有極易的開發特性,非常適合于linux下應用程序的開發。QTDesigner實現界面設計如下。
2.2 QT界面設計
QT界面設計是基于C++語言開發的,類似于Windows下VC++的MFC開發,而QT的界面都是功能模塊化的,開發起來更加簡潔和方便。本課題中設計的QT界面,是通過QT界面設計向導搭建界面框架來完成的,界面框架MainWind ow被分為四個部分:centralWidget、menuBar、mainToolBar和statusBar,添加需要的元件組件和信息內容到各個部分,之后編寫元件之間的邏輯程序和調用通信接口函數。另外,在設計過程中使用到了類QMainWindow、類QDialog和類QFrame,這三個類是QT界面開發過程中最常用的,它們全部繼承自QWidget,如圖3所示。
3 QT串口通信的實現
3.1 Linux下串口通信的原理
因為在QT中沒有提供串口控制類,所以需要使用一個由第三方提供的QextSerialPort類來實現串口通信。由于QextSerialPort類提供了兩個子類:QextSerialBase類和Po six_QextSerialPort類,分別用于Windows平臺和Linux平臺運行。這里在Linux下使用Posix_QextSerialPort類,該類關系圖如圖3所示。
可以看到,QextSerialPort類繼承自QT軟件自帶的QIOD evice類,所以該類中的一些函數可以直接調用。其中,Posix_QextSerialPort繼承自QextSerialBase, Posix_QextSerialPort類添加了Linux平臺下操作串口的一些功能。在QextSerialBase類中涉及到一個枚舉變量QueryMode,QueryMode指的是讀取串口的方式,它提供兩個值:查詢方式Polling和事件驅動方式EventDriven[71。其中,事件驅動方式EventDriven利用事件處理串口的讀取,一旦有數據到來,就會發出readyRead信號,這樣可以關聯該信號來讀取串口的數據。在此方式下,串口的讀寫是異步的,調用讀寫函數會立即返回,就不會凍結調用線程。而查詢方式Polling則不同,讀寫函數是同步執行的、信號在這種模式下無法工作,而且有些操作也無法實現,然而這種模式下的開銷較小。這樣就需要建立定時器來讀取串口的數據。本文介紹的就是用Polling方式來進行串口通信,因為linux下串口通信僅支持此種模式。
3.2 Polling方式串口通信的實現過程
由于Polling方式進行串口通信需要設置一個內部定時器,通過QT自有的信號與槽機制,將定時器超時信號與觸發函數關聯,每到定時器設定的時間后,串口就讀取一次數據或者發送一次用戶數據,這里以讀操作為例進行說明,關鍵代碼及注釋如下:
#define TIME_OUT10 //TIME_OUT是串口讀延時
#define TIMER—INTERVAL 200//讀取串口緩存的延時200ms
voidMainWindow::startlnit()//初始化
{…
timerdly= TIMER—INTERVAL,//初始化讀取定時器間隔 timer= new QTimer(this),//設置讀取計時器
connect(timer, SIGNAL(timeout(》,this, SLOT(readMyCom(》);//信號和槽函數關聯,延時lOms,進行讀串口操作
}
void MainWindow::on_Open_triggered()//打開串口
{…
myCom=new Posix—QextSerialPort(“/dev/ACMO”,QextSerialBase::Polling),//這里采用P olling方式,設備為CDC類下的ACMO
timer->start(timerdly),//開啟讀取定時器
myCom->setTimeout(TIME_OUT),//設置延時
}
具體串口通信的流程圖如圖4所示。
3.3 QT串口通信在Linux下的實現
在熟知QT下串口通信的原理后,在QT軟件中建立工程,通過調用QextSerialBase和Posix_QextSerialPort兩個類,利用Textbrowser、Label和Button等元件函數來實現QT界面的編寫,在PC機上調試Debug版本,調試成功后,可以發布Release版本,運行效果如圖5、6所示。至此,上位機Linux系統的圖形界面就設計完成了,也可根據自已的需要和使用習慣來設計圖形用戶界面,以達到最大的美觀效果和便捷性。
4 結語
文章介紹了實現USB CDC類設備通信實現和制作QT串口通信界面的方法。該方法簡單,可靠,易學,并且成本低廉。同時,本驅動軟件在Linux 2.6內核版本下通過了專業的測試和驗證,并應用到公達數碼的POS58和POS80等型號的打印機產品中,該公司使用本驅動軟件的打印機產品已廣泛地應用在餐飲行業及其他領域。另一方面,由于Linux系統和QT軟件均具有較強的可移植性,可以將本界面程序移植到手持設備端,這樣將會有更加廣闊的市場前景。