SIMCom芯片关于GPS定位信息的的解析(AT+CGNSINF)

SIMCom用户手册里的关于AT+CGNSINF的返回值的解释:

AT+CGNSINF return Parameters

Index 	Parameter 			Unit 			Range 						Length
1 	GNSS run status 		-- 			0-1 						1
2 	Fix status 			-- 		        0-1 						1
3 	UTC date & Time   		yyyyMMddhh								18
					mmss.sss
								yyyy: [1980,2039]
								MM : [1,12]
								dd: [1,31]
								hh: [0,23]
								mm: [0,59]
								ss.sss:[0.000,60.999]
4 	Latitude 	        	±dd.dddddd 		[-90.000000,90.000000]	 	                10
5 	Longitude 			±ddd.dddddd 	        [-180.000000,180.000000] 	                11
6 	MSL Altitude 			meters 									8
7 	Speed Over Ground 		Km/hour 		[0,999.99] 					6
8 	Course Over Ground 		degrees 		[0,360.00] 					6
9 	Fix Mode 		        -- 			0,1,2 						1
10 	Reserved1 															0
11 	HDOP				-- 			[0,99.9] 					4
12 	PDOP 				-- 			[0,99.9] 					4
13 	VDOP 				-- 			[0,99.9] 					4
14 	Reserved2 															0
15 	GPS Satellites in View -- 				[0,99] 						2
16 	GNSS Satellites Used -- 				[0,99]						2
17 	GLONASS Satellites in View -- 		                [0,99] 						2
18 	Reserved3 															0
19 	C/N0 max 		        dBHz 			[0,55] 					        2
20 	HPA[2] 			        meters 			[0,9999.9] 				        6
21 	VPA[2] 			        meters 			[0,9999.9] 				        6
												Total: (94) chars

下面给出AT+CGNSINF的实例:

GPS刚开时:

//字符串显示+CGNSINF: 1,0,19800106000007.000,,,,0.00,0.0,0,,,,,,0,0,,,,,OK//HEX显示

0D 0A 2B 43 47 4E 53 49 4E 46 3A 20 31 2C 30 2C 31 39 38 30 30 31 30 36 30 30 30 30 3130 2E 30 30 30 2C 2C 2C 2C 30 2E 30 30 2C 30 2E 30 2C 30 2C 2C 2C 2C 2C 2C 30 2C 30 2C 2C 2C 2C 2C 0D 0A 0D 0A 4F 4B 0D 0A

GPS定位成功后:

+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,,OK

一般用到的就4个:UTC时间,纬度,经度,可见卫星数

解析代码如下:

#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;
}

codeblock下运行结果:



  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值