/********************************************************************************* * Copyright: (C) 2023 LingYun IoT System Studio. * All rights reserved. * * Filename: pack_gps.c * Description: This file is GPS NMEA format string parser example * * Version: 1.0.0(2023年07月10日) * Author: Guo Wenxue * ChangeLog: 1, Release initial version on "2023年07月10日 17时21分35秒" * ********************************************************************************/ #include #include #include #define GPS_RAWDATA "\ $GPGSA,A,3,18,05,15,24,23,13,29,,,,,,2.2,1.1,1.9*3C\r\n\ $GPRMC,091859.000,A,3029.6909,N,11423.6327,E,0.23,200.08,100723,,,A*65\r\n\ $GPGGA,091900.000,3029.6909,N,11423.6326,E,1,07,1.1,28.2,M,-13.7,M,,0000*40\r\n" typedef struct gps_fix_s { char time[32]; /* GPS UTC time, formt: hhmmss */ char status; /* A: Valid V:Invalid */ float latitude; /* Latitude */ char lat; /* N: North S: South */ float longitude; /* Longitude */ char lon; /* E: East W: West */ float speed; /* Speed over ground, meters/sec */ float track; /* Course made good (relative to true north) */ } gps_fix_t; int proc_gprmc(char *buf, int size, gps_fix_t *info); int main (int argc, char **argv) { char buf[] = GPS_RAWDATA; gps_fix_t info; proc_gprmc(buf, strlen(buf), &info); return 0; } /* * $GPRMC,024216.000,A,3029.6651,N,11423.6251,E,0.08, 156.95,100723,,,A*65 * 1 024216.000 UTC time format: HHMMSS, 10:42:16(BeiJing) * 2 A Status of Fix: * A = Autonomous, valid; * D = Differential, valid; * V = invalid * * 3,4 3029.6651,N Latitude format: ddmm.mmmm, Latitude 30 deg. 29.6651 min North * 5,6 11423.6251,E Longitude: dddmm.mmmm, Longitude 114 deg. 23.6251 min East * 7 0.08 Speed over ground, Knots * 8 156.95 Course Made Good, True north * 9 100723 Date of fix ddmmyy. 2023-07-10 * 10,11 ,, Magnetic variation * 12 A FAA mode indicator (NMEA 2.3 and later) * A=autonomous, * D=differential, * E=Estimated, * M=Manual input mode, * N=not valid, * S=Simulator, * V=Valid * 13 *68 mandatory nmea_checksum */ #define DD(s) ((int)((s)[0]-'0')*10+(int)((s)[1]-'0')) int proc_gprmc(char *buf, int size, gps_fix_t *info) { char *ptr_start=NULL; char *ptr_end=NULL; char hhmmss[12]={0x0}; char ddmmyy[12]={0x0}; if( !buf || size<=0 || !info ) { printf("Invalid input arguments\n"); return -1; } printf("GPS receive raw data:\n%s\n", buf); if( !(ptr_start=strstr(buf, "$GPRMC")) ) { printf("$GPRMC keywords not matched\n"); return -2; } if( !(ptr_end=strchr(ptr_start, 0x0D)) ) { printf("$GPRMC data not integrated\n"); return -3; } *ptr_end = '\0'; memset(info, 0, sizeof(*info)); sscanf(ptr_start, "$GPRMC,%[^,],%c,%f,%c,%f,%c,%f,%f,%[^,]", hhmmss, &info->status, &info->latitude, &info->lat, &info->longitude, &info->lon, &info->speed, &info->track, ddmmyy); snprintf(info->time, sizeof(info->time), "%04d-%02d-%02d %02d:%02d:%02d", DD(ddmmyy+4)+2000, DD(ddmmyy+2), DD(ddmmyy), DD(hhmmss)+8, DD(hhmmss+2), DD(hhmmss+4)); if( info->status == 'A' ) { printf("NMEA0183: %s lat=%.2f(%c) lon=%.2f(%c) speed=%.2f, track=%.2f\n", info->time, info->latitude, info->lat, info->longitude, info->lon, info->speed, info->track); } else if( info->status == 'V' ) { printf("NMEA0183: Invalid data\n"); } return 0; }