当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]用QtE实现SBC一241OX上的LED控制

摘  要:QtE(Qt/Embedded)是挪威Trolltech公司专门为嵌入式系统设计的图形用户界面(GUI)的一个工具包。本文通过QtE编程,完成对基于ARM9的SBC-2410X开发板上LED的控制,并详细说明从程序设计、移植到运行的过程。程序能很好的运行在开发板上,验证了程序的有效性和可靠性。结果说明用QtE开发的应用程序界面清晰美观,操作简单方便。
关键词:QtE  ARM9  GUI  SBC-2410X


引言 

    近年来,由于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是广州友善之臂公司设计的一款基于ARM9的开发板,操作系统是韩国的mizi-linux。SBC-2410X不同于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设计移动手持设备的GUI有着得天独厚的优势。目前,Qt应用于全世界上百个软件开发项目中。在我国,Qt的发展也有星星之火可以燎原之势。本文通过一个最基础的小程序向读者演示了怎样使用Qt开发应用程序,以及怎样建立Qt与ARM的联系,希望对读者学习ARM和Qt起到一定的帮助作用。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭