解析AT+CGNSINF返回的gps信息

在发送指令:AT+CGNSINF后,返回信息

1,1,20190602092953.000,XX.XXXXXX,YY.YYYYYY,136.833,0.00,0.0,2,,1.5,1.7,0.9,,7,7,,,41,,

指令解析如下:

解析代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct GGPS_DATA
{
    char GNSSrunstatus[2];//GNSS run status:0 = GNSS off and 1 = GNSS on
    char Fixstatus[2];//Fix status:0 = Not fixed positon and 1 = Fixed positon
    char UTCdatetime[19];//UTC date & Time
    char latitude[11];//Latitude
    char logitude[12];//Longitude
    char altitude[9];//MSL Altitude
    char speedOTG[7];//Speed Over Ground
    char course[7];//Course Over Ground
    char fixmode[2];//Fix Mode
    char Reserved1[2];//Reserved1
    char HDOP[5];//HDOP
    char PDOP[5];//PDOP
    char VDOP[5];//VDOP
    char Reserved2[2];//Reserved2
    char satellitesinview[3];//GPS Satellites in View
    char GNSSsatellitesused[3];//GNSS Satellites Used
    char GLONASSsatellitesused[3];//GLONASS Satellites in View
    char Reserved3[2];//Reserved3
    char CN0max[3];//C/N0 max
    char HPA[7];//HPA
    char VPA[7];//VPA
};
struct GGPS_DATA GPS_DATA;
 
//input:AT+CGNSINF Command Response
//output:struct GGPS_DATA
void GPS_CGNSINF_Analyze(char *origin,struct GGPS_DATA *gpsdata)
{
    int counter = 0;
    char tmp[150] = {0};
    char *lptr = NULL;
    char *localptr = NULL;
 
    lptr=strstr(origin,"+CGNSINF");
    if(lptr==NULL)return;
    else lptr+=10;
 
    while(*lptr!='\0')
    {
        if(*lptr==','&&*(lptr+1)==',')
        {
            tmp[counter]=*lptr;
            counter++;
            tmp[counter]='0';
        }
        else if(*lptr=='\r'&&*(lptr+1)=='\n'&&counter<148)
        {
            tmp[counter]   = '0';
            tmp[counter+1] = ',';
            tmp[counter+2] = 0;
            break;
        }
        else
            tmp[counter]=*lptr;
 
        lptr++;
        counter++;
 
        //avoid array out of range
        if(counter>=148)return;
    }
    //Clear struct data
    memset(gpsdata,0,sizeof(struct GGPS_DATA));
 
    localptr = strtok(tmp,",");if(localptr == NULL) return;
    strcpy(gpsdata->GNSSrunstatus,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->Fixstatus,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->UTCdatetime,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->latitude,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->logitude,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->altitude,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->speedOTG,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->course,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->fixmode,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->Reserved1,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->HDOP,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->PDOP,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->VDOP,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->Reserved2,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->satellitesinview,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->GNSSsatellitesused,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->GLONASSsatellitesused,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->Reserved3,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->CN0max,localptr);
 
    localptr = strtok(NULL,",");if(localptr == NULL) return;
    strcpy(gpsdata->HPA,localptr);
 
    localptr = strtok(NULL,"\r\n");if(localptr == NULL) return;
    strcpy(gpsdata->VPA,localptr);
 
}
 
char test1[150]="asdfghjkl +CGNSINF: 1,0,19800106000007.000,,,,0.00,0.0,0,,,,,,0,0,,,,,\r\n\r\nOK\r\n asdfghjkl";
char test2[150]="asdfghjkl +CGNSINF: 1,1,20180209053930.000,31.362958,120.707803,-13.471,0.00,7.4,2,,0.7,1.3,1.1,,15,15,,,40,,\r\n\r\nOK\r\n asdfghjkl";
 
int main(void)
{
    GPS_CGNSINF_Analyze(test2,&GPS_DATA);
 
    printf("UTCdatetime = %s \n",GPS_DATA.UTCdatetime);
    printf("latitude = %s \n",GPS_DATA.latitude);
    printf("logitude = %s \n",GPS_DATA.logitude);
    printf("satellitesinview = %s \n",GPS_DATA.satellitesinview);
 
    return 0;
}

ref:

SIMCom芯片关于GPS定位信息的的解析(AT+CGNSINF)_Darkershadow的博客-CSDN博客

sim808 gps 定位数据解析_05jin的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值