From 68826376ee5f47783c644c6604f4411ec747cd7e Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Fri, 14 Nov 2025 23:52:16 +0800
Subject: [PATCH] Add UDP DNS client source code
---
project/1.packet/pack_gps.c | 124 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 124 insertions(+), 0 deletions(-)
diff --git a/project/1.packet/pack_gps.c b/project/1.packet/pack_gps.c
new file mode 100644
index 0000000..0b675ae
--- /dev/null
+++ b/project/1.packet/pack_gps.c
@@ -0,0 +1,124 @@
+/*********************************************************************************
+ * 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 <guowenxue@gmail.com>
+ * ChangeLog: 1, Release initial version on "2023年07月10日 17时21分35秒"
+ *
+ ********************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#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;
+}
+
--
Gitblit v1.9.1