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下运行结果: