新聞中心

        EEPW首頁 > 嵌入式系統 > 用QtE實現SBC一241OX上的LED控制

        用QtE實現SBC一241OX上的LED控制

        ——
        作者:西安交通大學 宋飛 趙廣社 時間:2007-11-30 來源:單片機及嵌入式系統應用 收藏

          摘  要(Qt/Embedded)是挪威Trolltech公司專門為嵌入式系統設計的圖形用戶界面()的一個工具包。本文通過編程,完成對基于開發板上LED的控制,并詳細說明從程序設計、移植到運行的過程。程序能很好的運行在開發板上,驗證了程序的有效性和可靠性。結果說明用開發的應用程序界面清晰美觀,操作簡單方便。

          關鍵詞
        :QtE     


        引言 


            近年來,由于ARM(Advanced RISC Machines)在性能、功耗、成本和體積上的優勢,使得它在嵌入式系統中的發展如日中天,它在工業控制、航空航天、軍事領域、消費電子、智能家電和視頻監控等方面都發揮了重大的作用。很多人都迫切地想學習ARM,以筆者的經驗,從最基本的LED控制學起,是一個不錯的選擇。
         
            如果不熟悉Linux,可能對QtE的概念知之甚少,它是挪威Trolltech公司為各種系統設計的圖形用戶界面工具包,采用c++語言編程。QtE的優點有:跨平臺,可以方便的連接數據庫,可以將程序與Java集成等。其實,QtE在一些高端的移動手持設備中早已深入人心,Troll—tech公司在QtE的基礎上開發了一個應用環境Qtopia,目前已有很多公司采用Qtopia來開發他們的主流PDA。當然,Qt也有它的缺點,既不能提供IDE(集成開發環境),但這個缺點在強大的Linux下顯得微不足道。使用gcc/g++,加上Qt的開發工具:Qt Designer,tmake/qmake,UIC等,開發可視化程序將變得十分容易。

            要學習ARM,選擇一款好的開發板是必不可少的。SBC一2410X是廣州友善之臂公司設計的一款基于的開發板,操作系統是韓國的mizi-linux。不同于uClinux,它的接口豐富,且支持MMU、QtE2.3.7,同時提供了控制LED的命令行方式。


        1 系統需求


           ◇完全安裝RedHat9.0。
           ◇在Linux下建立QtE編譯環境。
           ◇開發板上已經加載LED設備驅動程序。
            注意:你所建立的QtE版本必須與開發板所支持的版本一致。


        2 程序設計

            在Linux下,用系統自帶的Qt Designer來編寫程序。Qt Designer是一個優秀的可視化開發工具,用它來設計十分容易。它的界面類似于Delphi,但使用C++語言編寫應用程序。Qt程序設計里的一個亮點就是SignaI-_Slot機制,它有點類似于VC++里的消息機制。當一個組件發出Signal時,其他一個組件或多個組件可以通過Slot接收發來的SignaI,組件本身也可以接收自己的Signal,這樣處理一個事件將變得非常容易。Qt Designer的優點不僅在于它可以十分方便的設計圖形用戶界面,還表現在可以用連接工具很容易的把Signals和Slots連接起來。用戶自己設計的程序添加在**.ui.h中。

            打開Qt Deslgner,選擇File/new C++Project,命名為led.pro并保存。接著選擇File/new-Dialog,并在此設計自己的用戶界面。最后選擇File/new C++Main—File,系統自動生成一個main.cpp文件。圖形用戶界面如圖1所示,Initlalize按鈕主要完成LED設備的打開,定時器的關閉和其他一些初始化工作;Begim按鈕則針對LED Display Mode的開始;Exit按鈕為退出應用程序。左面的組合框包括4個RadioButton,對應4個LED的亮或滅;右面的組合框包括6個RadioButton(對應不同的閃爍模式和閃爍快慢)和1個LCDNumber(用來顯示閃爍的時間間隔)。本程序建立的Signal—S1ot連接有許多,下面對幾個重要的連接和函數進行說明。{{分頁}}

         


        (1)connect(initPushButton.SIGNAL(clicked()),this.SLOT(initial()))

            當Initialize按鈕按下時,LedForm對話框接收此信號,并執行initial()函數。Linux操作系統把所有的設備都看成文件,因此對設備的操作控制可以通過open()、ioctl()等函數實現。在initial()函數中就是調用了open()函數來打開LED設備的。

        (2)connect(okPushButton,SIGNAL(clicked()),this,SLOT(modeSel()))


            當Begin按鈕按下時,LedForm對話框接收此信號,并執行modeSel()函數。在modeSel()函數中開啟定時器,并創建另外一個連接用來循環顯示LED。在命令行方式中,LED的循環顯示要用到死循環,并用鍵盤中斷來控制循環;而在Qt或其他可視化語言中,則要用到定時器來控制循環。

        (3)函數open()


            在<fcntl.h>中聲明,含義為打開設備文件。打開成功返回0;失敗返回一1。

        (4)函數ioctl()


            在<sys/ioctl.h>中聲明,控制I/O端口。例如:

          Int fd=open(”/dev/leds”,0);

          ioctl(fd,0,3); //讓LED4滅

        (5)函數select()


            在<sys/select.h>中聲明,含義為經過多長時間訪問一次設備。


        3 程序移植與運行

            要想使程序運行在開發板的Qtopia中,則必須在建立的QtE環境下編譯,并設置好環境變量。終端進入所建立的QtE目錄后,環境變量或運行環境變量和腳本設置如下:
        export QTDIR=$PWD/qt
        export QPEDlR=$PWD/qtopia
        export TMAKEDIR=$PWD/tmake
        export TMAKEPATH=$TMAKEDIR/lib/qws/linux-armg++
        export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/
        bin:$PATH{{分頁}}

            值得注意的一點是:用Linux自帶的Qt Designer創建的工程文件只適用于qmake,而筆者建立的QtE環境只能用tmake來生成makefile,因此需要修改led.pro文件,讓它適用于tmake,修改如下:
        TEMPLATE =app
        CoNFIG +=qtopia warn_on release
        SoURCES +=main.epp
        INTERFACES =led.ui
        TARGET =led

            以上的工作做完后,就可以編譯了。編譯成功后生成可執行的二進制文件led,然而要使程序運行在開發板上的qtopia桌面上,還需要一個桌面文件led.desktop和自定義的一個圖標led.png。桌面文件如下:
        [Desktop Entry]
        Comment=a LED Control Program
        Exee=led
        Icon=led
        Type=Application
        Name=LED Control

            然后,把led復制到SBC-2410X下/opt/qtopia/bin目錄下,led.png復制到/opt/qtopia/pics目錄下,led.desktop復制到/0pt/qtopia/apps/Applications目錄下。最后,用ehmod a+X led改變文件led的權限,重新啟動系統,便可看到led.png的圖標顯示在qtopia桌面上,點擊此圖標就可運行程序了。


        4 部分源程序及注釋

            由于源程序代碼比較長,這里就不全部列出了,僅給出重要部分的代碼及注釋,以供讀者參考。

        (1) 程序的初始化


        int fd: //LED設備文件句柄
        int type=1; //默認方式為計數器
        double period=0.2; //默認時間間隔
        QTimer*t=new QTimer(Q″timer″);//創建定時器
        void LedForm::initial(){
        fd=open(″/dev/leds″,0); //打開LED設備
        //其他一些初始化語句
        一>stop(); //關閉定時器


        (2) LED顯示方式的設置


        void LedForm::push-leds(void){
        static unsigned step;
        unsigned led—bitmap;
        inti;
        switch(type){
        case 0: //方式0:跑馬燈
        if(step>=14){step=0;}
        if(step<7){led_bitmap=1<<step;}
        else{led_bitmap=1<<(14一step);}
        break;
        case 1: //方式1:計數器
        if(step>255){step=0;)
        Ied_bitmap=step!
        break;
        case 2: //方式2:停止
        led_bitmap=0:
        break;
        step十十;
        for(i=0;i<8;l++){
        ioctl(fd,led_bitmap&1,i);
        led_bitmap>>=1;
        }
        }{{分頁}}

        (3) LED設備的讀取及調用LED顯示程序


        void LedForm::ledDisplay(){
        fd_set rds;
        struct timeval step;
        FD_ZERO(&rds);
        step.tv_sec=period;
        step.tv_usec=(pefiod—step.W_sec)*1000000L;
        select(fd,&rds,NULL,NULL,&step);
        push_leds();
        }

        (4)循環顯示的實現

        void LedForm::modeSel(){
        t-->start(O);//啟動定時器,并立即發出Signal- timeout()
        connect(t,SIGNAL(timeout()),this.SLOT(1edDisplay()));
        }


        結 語

            隨著通信行業的迅猛發展,移動手持設備必將成為人們工作、學習和生活的主流,用Qt設計移動手持設備的有著得天獨厚的優勢。目前,Qt應用于全世界上百個軟件開發項目中。在我國,Qt的發展也有星星之火可以燎原之勢。本文通過一個最基礎的小程序向讀者演示了怎樣使用Qt開發應用程序,以及怎樣建立Qt與ARM的聯系,希望對讀者學習ARM和Qt起到一定的幫助作用。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 三门县| 绍兴市| 大田县| 济宁市| 林芝县| 九江市| 阿拉善盟| 仁怀市| 承德市| 青阳县| 仁化县| 礼泉县| 新竹县| 方山县| 大同市| 石景山区| 绥芬河市| 淮南市| 通辽市| 定兴县| 米泉市| 新丰县| 洪泽县| 且末县| 钟山县| 绥滨县| 司法| 新兴县| 洪泽县| 云阳县| 东乌珠穆沁旗| 安远县| 西乌| 崇义县| 息烽县| 古交市| 辽源市| 嘉祥县| 孝感市| 华容县| 石棉县|