嵌入式Linux通用GPS接口的设计与实现
摘 要:伴随着GPS的广泛应用,基于PC机的GPS由于其价格及功耗较高已不能满足社会发展的需要,嵌入式定位技术迅速发展起来。结合ARM处理器及嵌入式Linux操作系统的优势,提出一种基于嵌入式Linux平台的通用GPS接口设计方案。首先介绍GPS系统的定位原理与通信格式,在此基础上较为详细地阐述基于串行接口的嵌入式Linux与GPS设备的通信方案,最后给出基于中断模式的GPS信号接收与提取方法。该方案具有较强的通用性,可广泛应用于便携式GPS系统中。
关键词:ARM;嵌入式Linux;GPS;串行接口
中图分类号:TP368.1;TP336文献标识码:B
文章编号:1004373X(2008)2203904
Design and Implementation of General GPS Interface Solution Based
on Embedded Linux Operation System
LI Xuebin
(Changzhi College,Changzhi,046011,China)
Abstract:With the widely deployment of GPS,the system based on desktop can not meet the application requirements due to its high prize and high energy consumption,and embedded GPS technology is more and more popular.In this paper,a new kind of GPS interface solution uniting the advantages of ARM processor and embedded Linux operation system is proposed,which is based on embedded Linux platform.The paper first introduces the position principle and communication protocol of GPS,and illuminates the new COM-based communication solution between embedded Linux operation system and GPS system.An interruption-based GPS signal receiving-resolving solution is also illustrated.The solution can be used in various packed GPS systems.
Keywords:ARM;embedded Linux;GPS;serial interface
1 引 言
全球定位系统(Global Position System,GPS)是美国从20世纪70年代由美国国防部批准开始研制的,具有在海、陆、空进行全方位实时三维导航与定位能力的新一代卫星导航与定位系统。虽然最初GPS卫星定位系统是为军事用途而设计的,但其精密的全球定位、简便的观测、优异的实时性、丰富的功能、良好的抗干扰性能、极强的保密性等特点,使其获得广泛的应用。在火险处理中,精确的地理定位具有重要的意义,GPS的以上特点使其特别适合于火灾报警系统中的精确定位。
嵌入式系统是将先进的计算机技术、半导体技术和电子技术以及各个行业的具体应用相结合后的产物。它可以根据应用需求对软硬件进行适当裁剪,以满足应用系统对功能、可靠性、成本、体积等的需求。随着计算机技术的发展,基于PC机的定位系统由于其价格及功耗较高已不能满足社会发展的需要,脱离PC机的嵌入式定位技术迅速发展起来。
基于以上2点,本文提出以ARM器件为CPU,以嵌入式Linux为软件内核的GPS定位系统,并对Linux下通用GPS接口的设计加以详细阐述。ARM是当前全球领先的16/32位RISC微处理器内核,而Linux系统具有内核小、功能强大、运行稳定、系统健壮、效率高及开源等诸多优点。本设计解决了单独的基于PC机的定位系统和基于WinCE的嵌入式定位系统成本高或携带不便的问题,系统性价比高,可弥补传统定位系统的不足。
2 GPS定位原理与通信格式
2.1 GPS定位原理
按目前的方案,全球定位系统的空间部分用24颗高度约2.02×104 km的卫星组成卫星星座。21+3颗卫星均为近圆形轨道,运行周期约为11 h 58 min,分布在6个轨道面上(每轨道面4颗),轨道倾角为55°。卫星的分布使得在全球的任何地方、任何时间都可观测到4颗以上的卫星,并能保持良好定位解算精度的几何图形(DOP)。这就提供了在时间上连续的全球导航能力。
GPS的基本定位原理是:卫星不间断地发送自身的星历参数和时间信息,用户接收到这些信息后,经过计算求出接收机的三维位置、三维方向以及运动速度和时间信息,如图1所示。
图1 GPS定位原理
其中:
((x1-x)2+(y1-y)2+(z1-z)2)12+
c·(t-t01)=d1
((x2-x)2+(y2-y)2+(z2-z)2)12+
c·(t-t02)=d2
((x3-x)2+(y3-y)2+(z3-z)2)12+
c·(t-t03)=d3
((x4-x)2+(y4-y)2+(z4-z)2)12+
c·(t-t04)=d4(1)
由于含有接收机卫星钟的误差及大气传播误差,GPS接收机对码的量测就可得到卫星到接收机的距离,故称为伪距。对CA码(Coarse-Acquisition Code,粗捕获码)测得的伪距称为CA码伪距,精度约为24 m,对P码(Precise Code,精密码)测得的伪距称为P码伪距,精度约为2 m。
2.2 GPS通信格式
目前,几乎所有的GPS厂商都遵循美国国家海洋电子协会(National Marine Electronics Association)制定的NMEA-0183V20通信标准格式。GPS接收机的输出语句按照串行通信协议,数据格式为8个数据位、1个起始位、1个停止位,无奇偶校验位。本文中采用的数据传输的波特率为9 600 b/s。其输出语句采用的是NMEA0183即ASCII格式码,包括GGA,GSA,RMC,GSV,RMC,RMT,VTG等。这些定位语句不仅给出了位置、速度、时间等信息,而且指出了当地的卫星接收情况。根据项目的实际需求,本设计只提取GGA数据。GGA数据的数据格式为:所有的信息由¥开始,以换行结束,紧跟着¥后的5个字符解释了信息的基本类型,多重的信息之间用逗号隔开。其中
¥GPGGA,hhmmss,XXXX.XXXX,N/S,
12 3
XXXXX.XXXX,E/W,X,XX,XXX,0/-XXXX,
4 56 7 89
M, 0/-XXX, M,XXX,XXXX *hh
101112 131415
(1)世界时(UTC):hh:时;mm:分;ss:秒。例如,北京时间(东八时区)=UTC+8 h;
(2)纬度:“度度分分.分分分分”方式表示,小数点后也以分为单位;
(3)N:北纬;S:南纬;
(4)经度:以“度度度分分.分分分分”方式表示。小数点后也以分为单位;
(5)E:东经;W:西经;
(6)GPS质量指示。0:未定位;1:GPS定位;2:差分GPS定位;
(7)使用到的卫星数,可为0~12个。
(8)HDOP值:水平方向的定位精度劣化程度系数。三维定位时也会输出HDOP值。但在未定位时输出“099”。如果输出语句的经纬度输出设置精度达不到1/10 000时,小数点后省略;
(9)天线高度,0:正数,高于海平面;-:负数,低于海平面;
(10)天线高度,单位为m;
(11)地理高度,0:正数,高于海平面;-:负数,低于海平面;
(12)地理高度,单位为m;
(13)DGPS修正经过的时间。差分数据时间单位为s;
(14)差分基准站发播的ID编号;
(15)校验和。
GPS命令格式为:
¥PFST,
命令行以¥PFST开头,后面跟着参数,其中参数之间由逗号分隔开。GPS可以发送的数据如表1所示。
本设计中用到如下2个命令:
¥PFST,START,0为发送命令使GPS模块开始定位。
¥PFST,NMEA,2000,9600为定义要发送的数据,并设置通过串口传输的波特率。
其中参数选择2 000,即选择了向串口发送GGA数据。
表1 GPS 基本命令
MessagebitMessagebit
GLL0x1000GGA0x2000
VTG0x4000RMC0x8000
GSA0x0002FOM0x0020
GSV0x0001PPS0x0010
Reserved0x0040
3 嵌入式Linux 通用GPS接口的实现
3.1 Linux 串行接口通信的设置与操作
3.1.1 串口初始化
本系统中,GPS模块通过串口与Philip LPC2210嵌入式系统通信,处理器通过串口来获得定位信息数据。Linux通过虚拟设备文件统一管理硬件设备,并将硬件设备的技术细节隐藏起来。内核提供访问设备文件的系统函数,应用程序通过调用这些函数完成对硬件的操作。对串口访问控制的函数如表2所示,这些函数一起构成了通用的终端控制接口,提供了对终端的有效的控制操作。
表2 串口访问函数功能
函数描述
tcgetattr/tcsetattr获取/设置终端属性(termios结构)
cfgetispeed/cfsetispeed获取/设置输入速率
cfgetospeed/cfsetospeed获取设置输出速率
tcdrain等待所有输出被传送
tcflow暂停传送或接受
tcflush丢弃队列中尚未传送或接受的数据
tcsendbreak发送BREAK字符
tcgetpgrp/tcsetpgrp获取设置前台的进程组ID
在对串口操作之前,首先要对参数进行初始化、设置它的属性以保证通信双方的通信参数保持一致,这些属性定义在结构体struct termios中,如下所示:
struct termios{
tcflag_t c_ iflag;
tcflag_t c_oflag;
tcflag_ t c_cflag;
tcflag_ t c_ lflag;
cc_ta_cc[NCCS];
}
其中,c_iflag成员用于控制输入处理选项,它将影响到终端驱动程序在把输入发送给程序前是否对其进行处理,及怎样对其进行处理;成员c_oflag控制输出处理过程;c_cflag包含对端口的设置,如波特率、字符位数、停止位等;存储在成员c_iflag的本地模式标志符决定是否显示字符,是否发送信号到应用程序等;数组c_cc包含控制字符的定义和超时参数,在对struct.termios结构体的各个成员赋值,调用tcsetattr()函数选择新的设置完毕后,嵌入式Linux即可采用与普通文件的输入/输出相同的方式访问串口。
3.1.2 Linux下的串口I/O操作
Linux对于串口资源采用“ttyS+编号”来命名,所有设备以设备文件的形式存储在文件夹/dev中,其中每一个设备由一个主设备号和一个次设备号惟一确定。在Linux中串口设备被虚拟成文件,因此要访问1个串口,只需打开相应的设备文件,然后向这个文件读写数据就可以完成数据的接收和发送。首先调用open函数打开串口设备,使用完毕后用close函数关闭端口。使用的文件操作函数如下:
int open(coast char*pathname,int flags);
int close(int fd);
参数pathname指向欲打开的文件路径字符串;参数flags为设置打开方式;open系统调用返回一个整形文件标识符;以后所有的端口操作都针对这个标识符进行。close的参数fd为希望关闭的文件的标识符[7-10]。
在完成串口配置,使用open函数打开串口后,调用read和write函数接收和发送数据。这两个函数返回实际读写的字节数,如果有错误发生,则返回-1。第一个参数为要读/写的文件标识符,第二个参数为读/写缓存,第三个参数表示希望读/写的字节数。函数定义如下:
ssize_t read(int fd,void*buf,size_t count);
ssize_t write (int fd,const void*bufsize_t count);
3.2 基于中断模式的GPS信号提取
中断处理子函数主要用于处理串口接收到的数据,由于GPS发送的数据类型都是以¥符号开头,所以首先应检测¥符号,进而进行下一步的处理。
在此之前需要建立一个结构体,用来保存GPS数据,结构体中包括数组Data[80],用来保存GPS数据,数组长度设为80;还有一个状态标志位State,用于表示当前的接收状态,State = 1表示已经接收到¥,State = 2表示已经接收完1组GPS数据,可以对数据进行处理。State = 0表示还没有接收到GPS信息。定义Data[GPSDataQWPTR] 表示第GPSDataQWPTR位数据。串口在接收GPS数据的时候需要判断GPS数据的起始位和结束位,这一过程都在中断处理子函数中实现,具体的流程图如图2所示。
串口的中断处理子函数起着非常关键的作用,一方面,它要处理来自于串口的缓冲区的GPS数据,将串口中的数据写入一个缓冲队列中;另一方面,它还要负责与GPS_Handle()函数通信,通知GPS_Handle()任务开始对缓冲队列中的数据进行处理,将缓冲队列中的数据写入RAM中。根据¥GPRMC数据格式,通过设置逗号计数器即可解算出经、纬度等信息。
图2 中断处理子程序
4 结 语
GPS系统目前已广泛应用到社会的各个领域。Linux作为开源软件,开发周期相对较短、内核精简、功能强大、运行稳定、系统健壮、效率高。其易于定制裁剪,内核和用户界面完全独立。它非常灵活,各部分的可定制性都很强。正因为具有这些特性,为Linux在硬件资源有限的嵌入式领域提供了广阔的舞台。本文设计的基于嵌入式Linux平台的GPS接口具有较强的通用性,可广泛应用于便携式GPS系统中。
参考文献
[1]何林远,毕笃彦.嵌入式 Linux实时性的分析与研究\.计算机应用与软件,2008,25(2):225-227.
[2]孙守昌,韩红芳,孟煜.嵌入式Linux实时技术改进与实现\.微计算机信息,2007,23(12):67-69.
[3]任旭龙,周纬杰.基于嵌入式Linux操作系统内核实时性的改进方法研究\.计算机工程与科学,2006,28(1):125-127.
[4]周立功.ARM嵌入式系统基本教程[M].北京:北京航空航天大学出版社,2005.
[5]许海燕,付炎.嵌入式系统技术与应用[M].北京:机械工业出版社,2002.
[6]符意德.嵌入式系统设计原理及应用[M].北京:清华大学出版社,2004.
[7]胃静庄.嵌入式系统设计开发实例详解基于ARM的应用[M].北京:北京航空航天大学出版社,2005.
[8]王田苗.嵌入式系统设计与实例开发[M].北京:清华大学出版社,2002.
[9]刘铮蓉,张智超,许振山,等.嵌入式Linux应用技术详解[M].北京:机械工业出版社,2004.
[10]Craig Hollabaugh.嵌入式Linux硬件、软件与接口[M].陈雷,译.北京:电子工业出版社,2003.
[11]马忠梅,李善平,康慨.ARM&Linux嵌入式系统教程[M].北京:北京航空航大大学出版社,2004.
[12]Karim Yaghmour.Building Embedded Linux Systems[M].New York:O′Reilly Press,2003.
作者简介 李学斌 男,1956年出生,山西长治学院计算机系副教授。主要研究方向为计算机应用。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文