Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397433
  • 博文数量: 29
  • 博客积分: 2091
  • 博客等级: 大尉
  • 技术积分: 463
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-05 10:53
文章分类
文章存档

2012年(2)

2011年(6)

2010年(12)

2009年(9)

我的朋友

分类: 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信息的校验和,databufGPS字符串,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开发板,其特点是提供了RS232USBTTL三种接口,方便学习和开发。

淘宝连接

阅读(12530) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~