GPS模块运用: GPS模块数据提取、常规参数配置(脉冲频率、输出指定命令、定位模式等)

一、硬件介绍

GPS模块型号:  中科微电子ATGM336H-5N 系列模块

ATGM336H-5N 系列模块是 9.7X10.1 尺寸的高性能 BDS/GNSS 全星座定位导航模块系列的总称。该系列模块产品都是基于中科微第四代低功耗 GNSS SOC 单芯片—AT6558,支持多种卫星导航系统,包括中国的 BDS(北斗卫星导航系统),美国的 GPS,俄罗斯的 GLONASS,欧盟的 GALILEO,日本的 QZSS以及卫星增强系统 SBAS(WAAS,EGNOS,GAGAN,MSAS)。AT6558 是一款真正意义的六合一多模卫星导航定位芯片,包含 32 个跟踪通道,可以同时接收六个卫星导航系统的 GNSS 信号,并且实现联合定位、导航与授时。

ATGM336H-5N 本系列模块具有高灵敏度、低功耗、低成本等优势,适用于车载导航、手持定位、可穿戴设备,可以直接替换 Ublox MAX 系列模块。

GPS模块运用: GPS模块数据提取、常规参数配置(脉冲频率、输出指定命令、定位模式等)_第1张图片

GPS模块运用: GPS模块数据提取、常规参数配置(脉冲频率、输出指定命令、定位模式等)_第2张图片

二、GPS数据格式介绍

GPS模块支持输出标准的NMEA0183 协议。

GPS收到的数据示例:

$GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F
$GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D
$GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37
$BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A
$GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B
$GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C
$GPGSV,3,3,10,31,50,287,36,32,66,018,*7F
$BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62
$GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D
$GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14
$GNZDA,114955.000,06,11,2017,00,00*47
$GPTXT,01,01,01,ANTENNA OK*35

下面介绍GPS每条命令的含义:

序号 命令 说明 最大帧长
1 $GNGGA GPS/北斗定位信息 72
2 $GNGSA 当前卫星信息 65
3 $GPGSV 可见 GPS 卫星信息 210
4 $BDGSV 可见北斗卫星信息 210
5 $GNRMC 推荐定位信息 70
6 $GNVTG 地面速度信息 34
7 $GNGLL 大地坐标信息 --
8 $GNZDA 当前时间(UTC1)信息 --


1, $GNGGA (GPS 定位信息, Global Positioning System Fix Data)
$GNGGA 语句的基本格式如下(其中 M 指单位 M, hh 指校验和, CR 和 LF 代表回车
换行,下同):
$GNGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)
(1) UTC 时间,格式为 hhmmss.ss;
(2) 纬度,格式为 ddmm.mmmmm(度分格式);
(3) 纬度半球, N 或 S(北纬或南纬);
(4) 经度,格式为 dddmm.mmmmm(度分格式);
(5) 经度半球, E 或 W(东经或西经);
(6) GPS 状态, 0=未定位, 1=非差分定位, 2=差分定位;
(7) 正在使用的用于定位的卫星数量(00~12)
(8) HDOP 水平精确度因子(0.5~99.9)
(9) 海拔高度(-9999.9 到 9999.9 米)
(10) 大地水准面高度(-9999.9 到 9999.9 米)
(11) 差分时间(从最近一次接收到差分信号开始的秒数,非差分定位,此项为空)
(12) 差分参考基站标号(0000 到 1023, 首位 0 也将传送,非差分定位,此项为空)
举例如下:
$GNGGA,095528.000,2318.1133,N,11319.7210,E,1,06,3.7,55.1,M,-5.4,M,,0000*69


2, $GNGSA(当前卫星信息)
$GNGSA 语句的基本格式如下:
$GNGSA,(1),(2),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(4),(5),(6)*hh(CR)(LF)
(1) 模式, M = 手动, A = 自动。
(2) 定位类型, 1=未定位, 2=2D 定位, 3=3D 定位。
(3) 正在用于定位的卫星号(01~32)
(4) PDOP 综合位置精度因子(0.5-99.9)ALIENTEK
(5) HDOP 水平精度因子 1(0.5-99.9)
(6) VDOP 垂直精度因子(0.5-99.9)
举例如下:
$GNGSA,A,3,14,22,24,12,,,,,,,,,4.2,3.7,2.1*2D
$GNGSA,A,3,209,214,,,,,,,,,,,4.2,3.7,2.1*21
注 1: 精度因子值越小,则准确度越高。


3, $GPGSV(可见卫星数, GPS Satellites in View)
$GPGSV 语句的基本格式如下:
$GPGSV, (1),(2),(3),(4),(5),(6),(7),...,(4),(5),(6),(7)*hh(CR)(LF)
(1) GSV 语句总数。
(2) 本句 GSV 的编号。
(3) 可见卫星的总数(00~12,前面的 0 也将被传输)。
(4) 卫星编号(01~32,前面的 0 也将被传输)。
(5) 卫星仰角(00~90 度,前面的 0 也将被传输)。
(6) 卫星方位角(000~359 度,前面的 0 也将被传输)
(7) 信噪比(00~99dB,没有跟踪到卫星时为空)。
注:每条 GSV 语句最多包括四颗卫星的信息,其他卫星的信息将在下一条$GPGSV 语句中输出。
举例如下:
$GPGSV,3,1,11,18,73,129,19,10,71,335,40,22,63,323,41,25,49,127,06*78
$GPGSV,3,2,11,14,41,325,46,12,36,072,34,31,32,238,22,21,23,194,08*76
$GPGSV,3,3,11,24,21,039,40,20,08,139,07,15,08,086,03*45


4, $BDGSV(可见卫星数, GPS Satellites in View)
$BDGSV 语句的基本格式如下:
$BDGSV, (1),(2),(3),(4),(5),(6),(7),...,(4),(5),(6),(7)*hh(CR)(LF)
(1) GSV 语句总数。
(2) 本句 GSV 的编号。
(3) 可见卫星的总数(00~12,前面的 0 也将被传输)。
(4) 卫星编号(01~32,前面的 0 也将被传输)。
(5) 卫星仰角(00~90 度,前面的 0 也将被传输)。
(6) 卫星方位角(000~359 度,前面的 0 也将被传输)
(7) 信噪比(00~99dB,没有跟踪到卫星时为空)。
注:每条 GSV 语句最多包括四颗卫星的信息,其他卫星的信息将在下一条$BDGSV 语句中输出。
举例如下:
$BDGSV,1,1,02,209,64,354,40,214,05,318,40*69


5, $GNRMC(推荐定位信息, Recommended Minimum Specific GPS/Transit Data)
$GNRMC 语句的基本格式如下:
$GNRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF)
(1) UTC 时间, hhmmss(时分秒)
(2) 定位状态, A=有效定位, V=无效定位
(3) 纬度 ddmm.mmmmm(度分)
(4) 纬度半球 N(北半球)或 S(南半球)ALIENTEK
(5) 经度 dddmm.mmmmm(度分)
(6) 经度半球 E(东经)或 W(西经)
(7) 地面速率(000.0~999.9 节)
(8) 地面航向(000.0~359.9 度,以真北方为参考基准)
(9) UTC 日期, ddmmyy(日月年)
(10) 磁偏角(000.0~180.0 度,前导位数不足则补 0)
(11) 磁偏角方向, E(东)或 W(西)
(12) 模式指示(A=自主定位, D=差分, E=估算, N=数据无效)
举例如下:
$GNRMC,095554.000,A,2318.1327,N,11319.7252,E,000.0,005.7,081215,,,A*73


6, $GNVTG(地面速度信息, Track Made Good and Ground Speed)
$GNVTG 语句的基本格式如下:
$GNVTG,(1),T,(2),M,(3),N,(4),K,(5)*hh(CR)(LF)
(1) 以真北为参考基准的地面航向(000~359 度,前面的 0 也将被传输)
(2) 以磁北为参考基准的地面航向(000~359 度,前面的 0 也将被传输)
(3) 地面速率(000.0~999.9 节,前面的 0 也将被传输)
(4) 地面速率(0000.0~1851.8 公里/小时,前面的 0 也将被传输)
(5) 模式指示(A=自主定位, D=差分, E=估算, N=数据无效)
举例如下:
$GNVTG,005.7,T,,M,000.0,N,000.0,K,A*11


7, $GNGLL(定位地理信息, Geographic Position)
$GNGLL 语句的基本格式如下:
$GNGLL,(1),(2),(3),(4),(5),(6),(7)*hh(CR)(LF)
(1) 纬度 ddmm.mmmmm(度分)
(2) 纬度半球 N(北半球)或 S(南半球)
(3) 经度 dddmm.mmmmm(度分)
(4) 经度半球 E(东经)或 W(西经)
(5) UTC 时间: hhmmss(时分秒)
(6) 定位状态, A=有效定位, V=无效定位
(7) 模式指示(A=自主定位, D=差分, E=估算, N=数据无效)
举例如下:
$GNGLL,2318.1330,N,11319.7250,E,095556.000,A,A*4F


7, $GNZDA(当前时间信息)
$GNZDA 语句的基本格式如下:
$GNZDA,(1),(2),(3),(4), (5), (6)*hh(CR)(LF)
(1) UTC 时间: hhmmss(时分秒)
(2) 日
(3) 月
(4) 年
(5) 本地区域小时(NEO-6M 未用到,为 00)
(6) 本地区域分钟(NEO-6M 未用到,为 00)
举例如下:
$GNZDA,095555.000,08,12,2015,00,00*4C

 

三、解析代码

下面代码里编写了两个重要函数: 

第一个函数:   计算GPS指定一条数据的校验和

第二个函数:   提取一条数据指定位置的数据

下面的示例代码是在Qt Creator 里编写的。

#include 
#include 
#include 

extern "C"
{
#include 
}

class GPS_Data
{
public:
    double lat; //纬度
    double lng; //经度
    QString GPS_Data;
    QString S; //速度
};

class GPS_Data gps_data;


/*
函数功能: 根据逗号位置提取数据
函数参数:
char *gps_src GPS源字符串地址
char *buff 存放提取的数据
char *find_head 查找的GPS数据头  例如:$GNVTG
int cnt  逗号的偏移量
返回值:提取的字节数。
*/
int GPS_GetData(const char *gps_src,const char *find_head,char *buff,int cnt)
{
    char *p;
    int number=0; //提取的数量
    int a=0;
    p=strstr(gps_src,find_head);
    if(p!=NULL)
    {
        //查找逗号的位置
        while(*p!='\0')
        {
            if(*p==',')a++; //记录逗号的数量
            if(a==cnt)break; //逗号找成功了
            p++;
        }
        p++; //跨过当前逗号
        //提取数据
        while(*p!='\0')
        {
            if(*p==',')break; //遇到逗号停止提取数据
            buff[number]=*p;
            p++;
            number++;
        }
        buff[number]='\0';
    }
    return number;
}

/*
 * 计算GPS数据指定数据的校验和
 * char *src_str GPS源字符串
 * char *find_str GPS数据头  例如:$GNVTG
 * 返回值: -1表示失败  0表示成功
*/
int GPS_GetCheckSum(const char *src_str,const char *find_str)
{
    char *tmp_p;
    /*1. 开始解析数据*/
    tmp_p=strstr(src_str,find_str);
    if(tmp_p!=nullptr)
    {
        unsigned char data=0;
        tmp_p++;
        //计算校验和
        while(*tmp_p!='*' && *tmp_p!='\0')
        {
            data^=*tmp_p;
            tmp_p++;
        }
        QString sum_str=QString::number(data,16);
        QString sum_val;
        //提取校验和
        sum_val[0]=*(tmp_p+1);
        sum_val[1]=*(tmp_p+2);

        //判断校验和,不区分大小写
        if(sum_str.compare(sum_val,Qt::CaseInsensitive)==0)
        {
            return 0; //校验正确
        }
    }
    return -1;
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

#if 0
    //原始数据
    QString text="start:f=1;0,end start:f=2;1607,end start:f=3;0,end start:f=1;0,end start:f=2;1640,end start:f=3;0,end start:f=1;0,end start:f=2;1666,end start:f=3;0,end";

    int i=0;
    //解析数据
    while(1)  //判断数据是否为真
    {
        QString data=text.section(QRegExp("\\s"),i,i);  //截取s字符开始的数据
        qDebug()<

GPS模块运用: GPS模块数据提取、常规参数配置(脉冲频率、输出指定命令、定位模式等)_第3张图片

四、设置GPS模块输出特定的命令

GPS模块上电默认会以1秒的频率将收到的全部数据发送出来,而实际使用GPS的时候,可能只需要经纬度等一些信息,这时候可以通过配置指令设置GPS模块。

中科微电子附带的配置软件支持这些配置。

GPS模块运用: GPS模块数据提取、常规参数配置(脉冲频率、输出指定命令、定位模式等)_第4张图片

常用的配置指令如下:(注意: 每个指令后面有\r\n)

设置GPS模块为车载模式:  $PCAS11,3*1E
打开全部语句输出: $CCRMO,GGA,4,1*38
关闭全部语句输出: $CCRMO,GGA,3,1*3F
打开RMC语句输出: $CCRMO,RMC,2,1*23
打开VTG语句输出: $CCRMO,VTG,2,1*3A

GPS模块运用: GPS模块数据提取、常规参数配置(脉冲频率、输出指定命令、定位模式等)_第5张图片

下面公众号有全套的单片机、QT、C++、C语言、物联网相关的教程,欢迎关注:

GPS模块运用: GPS模块数据提取、常规参数配置(脉冲频率、输出指定命令、定位模式等)_第6张图片

 

你可能感兴趣的:(C语言,QT,gps)