Qt/Embedded是奇趣科技推出的基于Linux的嵌入式平台开发工具,是Qt的嵌入式版本。由于KDE等项目均使用Qt作为支持库,所以许多基于Qt的X Windows程序可以非常方便地移植到Qt/Embedded版本上。Qt/Embedded具有面向对象、跨平台和界面设计方便美观等优点,已得到了广泛的应用。
本文针对当前物流行业终端定位功能的需求,提出与之相适应的物流终端定位功能实现方案,并利用Qt/Embedded,在基于嵌入式Linux和S3C2410的物流信息化终端平台上对终端定位功能进行了初步实现。
软硬件系统设计原理
基于现有网络建设的总体情况和物流配送过程中对定位数据的可靠性、连续覆盖性、精度的要求,并综合考虑各种定位技术的发展现状及技术成熟度、实现成本等因素,本系统在物流配送网络中采用了GPS辅助定位系统,即GPS+CellID+RFID+图形道路匹配相结合的定位技术。
系统的软硬件功能框图如图1所示,开发板CPU采用的是三星公司的S3C2410。该处理器内部集成了ARM公司ARM920T处理器核的32 位微控制器。GPS模块利用RS232接口与开发板通信,提供卫星定位信号;GSM/GPRS模块提供通信以及CELLID定位信息获取;RFID模块提供标签信息采集和RFID定位功能。终端通过GSM/GPRS通信网络与物流信息控制中心建立联系,提交相关数据采集信息和接收物流信息控制中心指令。
系统采用嵌入式Linux操作系统,移植Qt/Embedded 3.3.4和SQLITE数据库,采用Qt编程实现物流信息化终端定位功能。
软件系统设计
本文的软件系统设计主要以S3C2410平台为核心,通过RS-232串口从GPS模块、GSM/GPRS模块、RFID模块提取
定位信息,加以分析转换,并根据需要用于终端导航或通过GSM/GPRS网络提交给物流信息控制中心。
宿主机开发环境建立
由于目标平台资源所限,需要搭建交叉编译环境,本系统开发过程中采用的平台如下:
宿主机:RED HAT 9.0
Qt/X11 3.3.4
Qt/Embedded 3.3.4
SQLITE 2.8.16
cross-2.95.3.tar.bz2
目标机:Linux Kernel 2.4.18
Qt/Embedded 3.3.4
SQLITE 2.8.16
Qt/Embedded 3.3.4移植
为了正确交叉编译Qt/Embedded,建议宿主机完全安装RED HAT 9.0,同时要确保UUID、ZLIB、JPEG、GIF、PNG、SQLITE等Qt中所需要的头文件、库文件在交叉编译前正确安装,并移植相应的库文件至目标机中,此类文件的具体安装在此不再赘述。下面主要对Qt/Embedded 3.3.4的交叉编译及移植进行详细讨论。
下载解压源文件
$ cd ~
$ mkdir -p qt_embedded/
$ cd qt_embedded
$ wget ftp://ftp.trolltech.com/qt/source/qt-x11-free-3.3.4.tar.bz2
$ wget ftp://ftp.trolltech.com/qt/source/qt-embedded-free-3.3.4.tar.bz2
$ tar jxf qt-x11-free-3.3.4.tar.bz2
$ tar jxf qt-embedded-free-3.3.4.tar.bz2
$ mkdir -p qt-embedded-free-3.3.4-target/
$ sudo cp -r qt-embedded-free-3.3.4/ qt-embedded-free-3.3.4-target/
安装Qt/X11
$ cd qt-x11-free-3.3.4
$ export QTDIR=$PWD
$ export PATH=$QTDIR/bin:$PATH
$ export LD_LIBRARY_PATH =$QTDIR/lib:$LD_LIBRARY _PATH
$ echo yes | ./configure -thread -plugin-sql-sqlite -prefix /usr/local/ Qt-3.3.4/
$ make
$ sudo make install
安装Qt/E 3.3.4的宿主机版本
为便于在宿主机上进行嵌入式程序开发,利用qvfb进行虚拟嵌入式LCD屏幕显示。
$ cd /qt-embedded-free-3.3.4
$ export QTDIR=$PWD
$ export PATH=$QTDIR/bin:$PATH
$ export LD_LIBRARY_PATH =$QTDIR/lib:$LD_LIBRARY _PATH
$ echo yes | ./configure -thread -plugin-sql-sqlite -prefix /usr/local/Qt-embedded-3.3.4-host -qvfb
$ make
$ sudo make install
$ sudo cp -r lib/fonts/ /usr/local/Qt-embedded-3.3.4-host/lib/
安装Qt/E 3.3.4的目标机版本
$ cd /qt-embedded-free-3.3.4-target
$ cp /qt-x11-free-3.3.4/bin/uic bin/(注意:需拷贝uic工具的QT/X11版本至安装目录中)
由于Qt/E3.3.4没有专门针对触摸屏的配置选项,为了确保触摸屏能正常工作,可以利用现有的配置选项进行修改,以满足实际需要。现利用qt-mouse-Linuxtp修改触摸屏驱动。
修改src/embedded/qmouselinuxtp-qws.h,添加下面两行:
#
define Qt_QWS_IPAQ
#define Qt_QWS_IPAQ_RAW
修改src/embedded/qmouselinuxtp-qws.cpp,把文件中/dev/**3600改为开发板ARM-Linux操作系统中相应触摸屏驱动的名称/dev/touchscreen/0raw。
$ echo yes | ./configure -embedded arm -shared -debug -no-cups -thread -plugin-sql-sqlite -no-ipv6 -qt-mouse-Linuxtp -prefix /usr/local/Qt-embedded-3.3.4-target -depths 16 -system-libpng -system-libjpeg
$ export QMAKESPEC=“qws/linux-arm-g”++
$ make
$ sudo make install
$ sudo cp -r lib/fonts/ /usr/local/Qt-embedded-3.3.4-target/lib/
此时,将交叉编译的Qt/E 3.3.4的库文件下载至开发板中,并设置相应的环境变量QTDIR、PATH、LD_LIBRARY_PATH等。另外还要设置触摸屏环境变量如下:
$ export QWS_MOUSE_ PROTO=“LinuxTP:/dev/touchscreen/0raw”
$ export QWS_KEYBOARD=
此时,触摸屏可能仍无法工作或误差较大,其主要原因是开发板操作系统中/etc/pointercal文件不存在或该文件中对触摸屏进行调整的校准参数不正确,需对/etc/pointercal文件进行修改。修改方法有两种:一种方法是直接新建该文件,并在文件中按正确格式添加相应参数;另一种方法是交叉编译tslib-1.3.tar.bz2,将生成的校准程序拷贝至目标板,设置环境变量,运行校准程序,可直接生成高精度的/etc /pointercal文件。这里推荐使用第二种方法。
至此,Qt/E3.3.4便可在目标板上正确执行,移植完毕。
Qt/E编程
本文采用Qt/Embedded 3.3.4版本,主要是考虑到Qt/E 3.3版本相对以往版本更成熟,可视化编程相对更方便易用,且其支持SQLITE数据库驱动,便于数据库操作与编程。在本设计中主要使用了Qt/E的画布模块、SQL模块、网络模块及多线程编程,缩短了程序的开发周期,提高了开发效率。下面主要就多线程编程和画布模块编程进行讨论。
多线程编程
通常情况下图形用户界面应用程序有一个执行线程并且每次执行一个操作。如果用户在单线程的应用程序中从用户界面中调用一个耗时的操作,当这个操作被执行的时候,用户界面通常会被冻结。本实现使用QThread子类化得到QGPSThread类,并使用QMutex、QSemphore和 QWaitCondition来同步各线程。QGPSThread类用于通过串口编程接收GPS模块的$GPRMC定位数据帧,并加以解析,得到实时的经纬度等定位信息,供其它线程使用。
画布模块
画布模块中QCanvas库是一个高度优化的二维绘图库,QCanvas可以包含很多任意图形的项并且在内部使用双缓冲来避免闪烁,而且 QCanvas支持分层,适合数字地图的分层显示。QCanvas与其它画布模块结合使用,能很方便地实现导航地图的显示、缩放、漫游以及鹰眼等功能。下面是导航地图常用操作的实现代码。
void Form2::zoomin() //缩小地图比例
{
QWMatrix m = mapview->worldMatrix();
m.scale( 0.5, 0.5 );
mapview->setWorldMatrix( m );
}
void Form2::movleft() //地图向左漫游
{
mapview->scrollBy(-10,0);
}
void Form2::centerpoint() //将当前定位点居于显示地图正中
{
mapview->center (pointx,pointy);
}
void Form2::movleft() //定位点在地图上移动
{
i->move (pointx,pointy);
canvas->update();
}
初步实现
嵌入式信息终端平台定位功能的初步实现如图2所示,该系统人机界面友好,定位精确。定位误差主要取决于GPS-OEM模块的定位精度,实验显示,本系统能初步满足物流信息终端对定位功能的需求。
结语
本文提出了一种嵌入式物流信息化终端定位功能的实现方案,并利用Qt/E编程对其进行了初步实现。实验结果证明,
系统定位数据精确、界面友好、系统可扩展性强,较好地完成了物流信息化终端定位功能。
参考文献
1.常菲,李明禄,李鲁群。物流配送中移动定位技术研究[J]。微型电脑应用(研究与设计),2004,20(1)。22-24
2.杨晕,胡永健,林志泉。基于Linux和S3C2410嵌入式图象传输系统设计[J]。微计算机信息(嵌入式与SOC),2007,23(3-2)。20-24
3.(加拿大)布兰切尼(Blanchette,J.),(英)桑姆菲尔德(Summerfield,M.)著;齐亮译。C++ GUI Qt3 编程[M]。北京:北京航空航天大学出版社,2006