分类: C/C++
2010-12-29 10:04:10
现在GPS的应用越来越广泛,已不仅仅应用于导航系统了。很多项目中,都用到了GPS。比如车载防盗系统。公交调度系统,自动气象仪等等。这里,我大致谈一下GPS数据的提取方法。
GPS数据都是一条条的ASCII字符串。每个字符串的开头都是以’$’开头。以累加和校验(’*’后的两个字符)以及回车换行结束。’$’后跟的标识表示当前的字符的种类。如GPRMC,GPGGA等。每种字符串内所包含的数据以’,’分开。每种字符串所包含数据的格式,在GPS的手册中都有详细说明,这里不多说,主要是说一下,各种字符串的主要用处。
$GPRMC,最常用的字符串,包含了时间,日期,定位,和航速航向信息。一般应用,只要有这些信息就可以了。
$GPGGA,包含了定位信息相关的详细信息。如定位时用到的星数,定位的方式,天线的海拔高度,精度等等。
$GPGSA,包含了定位,水平,海拔三种DOP信息,即精度信息,包含了定位所用到的卫星ID。
$GPGSV,包含了GPS模块可以看到的星数(注意,只是能看到的星数,实际使用到的星数在GPGGA中),以及这些卫星的ID号,仰角,方位角,信噪比。关于这种字符串要特别说明的是,它可能会由几条GPGSV字符串组成,因此,每个字符串都包含了共几条字符串,本字串是第几条这样的信息。一般的GPS最多是三条。也有的GPS模块会超过3条。
$GPVTG,包含了更详细的航向航速的信息,航向信息分为以真北为参考和以地磁北为参考(真北和地磁北是不一样的,两者相差几度),航速信息则给出了以节为单位和以公里/时为单位的数据。
以上信息,一般GPS模块都会默认输出,也有的模块只输出其中几个。
在C语言中,提供了一些与字符串处理有关的函数,因此想要将这些字符串中的数据提出,只要使用这些函数即可。其基本方法是使用strchr函数,将字符串以’,’为间隔分开来,用atoi函数读取整数值,用sscanf函数来读取浮点数。在单片机中,因为处理浮点数效率低,可考虑将浮点数拆分为两个整数,即整数部分的数和小数部分的数。
要特别说明的是,通过串口读取GPS字串时,一般是极可靠的,但在实际应用中,有时会出错或出现读取不全的现象,因此,对读到的GPS字串最好是进行累加和校验,其方法是将除’$’以后到’*’以前的数据计算累加和,将结果与’*’后所包含的累加和比对。一致则认为校验通过。下面,给出我用的算法。
//检验GPS信息的校验和,databuf为GPS字符串,buflen为字符串长度(含$及回车换行符的长度)
unsigned char CheckSum(char *databuf,unsigned char buflen)
{
unsigned char sum;
unsigned char c1;
unsigned char c2;
int i;
sum = 0;
for(i=1;i<(buflen-5);i++)
{
sum = sum ^ databuf[i];
}
c2 = sum&0x0F;
c1 = (sum>>4)&0x0F;
if(c1<10) c1 +='0';else c1 += 'A' -10;
if(c2<10) c2 +='0';else c2 += 'A' -10;
if(c1 == databuf[buflen-4] && c2 == databuf[buflen-3]) //比较时,要注意这节序,我这里是在小端模式下的字节序
{
return 1;
}
return 0;
}
我写了一个软件,可以演示GPS数据的解析。给大家参考一下,方便学习。
下载地址
另外,如大家需要,还可以购买我的GPS开发板,其特点是提供了RS232,USB,TTL三种接口,方便学习和开发。
淘宝连接