C语言实现GPS模块NMEA数据解析函数
#include <stdio.h> #include <string.h>
#define MAX_NMEA_LEN 80 // NMEA数据最大长度
// GPS定位信息结构体 typedef struct { float latitude; // 纬度 float longitude; // 经度 float altitude; // 海拔高度 int satellites; // 可见卫星数 } gps_location_t;
// GPS模块解析函数 int parse_gps_nmea(const char *nmea_sentence, gps_location_t *location) { char nmea_type[6]; // NMEA数据类型 char *token; // NMEA数据字段 char *ptr; // 字符串指针 int i = 0; // 循环计数器
// 判断NMEA数据是否合法
if (nmea_sentence[0] != '$' || nmea_sentence[strlen(nmea_sentence) - 1] != '\n') {
return -1;
}
// 切分NMEA数据字段
token = strtok((char *)nmea_sentence, ",");
while (token != NULL && i < 6) {
switch (i) {
case 0: // 数据类型
if (strncmp(token, "$GPGGA", 6) != 0) {
return -1;
}
break;
case 2: // 纬度
location->latitude = atof(token) / 100;
ptr = strchr(token, '.');
location->latitude += (atof(ptr + 1) / 60) * 100;
break;
case 3: // 纬度方向
if (*token == 'S') {
location->latitude *= -1;
}
break;
case 4: // 经度
location->longitude = atof(token) / 100;
ptr = strchr(token, '.');
location->longitude += (atof(ptr + 1) / 60) * 100;
break;
case 5: // 经度方向
if (*token == 'W') {
location->longitude *= -1;
}
break;
case 6: // 定位质量指示符
if (atoi(token) < 1) {
return -1;
}
break;
case 7: // 可见卫星数
location->satellites = atoi(token);
break;
case 9: // 海拔高度
location->altitude = atof(token);
break;
default:
break;
}
token = strtok(NULL, ",");
i++;
}
return 0;
}
int main() { char nmea_sentence[MAX_NMEA_LEN]; gps_location_t location = {0};
// 假设这里读取到的NMEA数据为: '$GPGGA,082623.000,2238.0069,N,11404.1439,E,1,08,1.2,45.6,M,0,M,,*7E\n'
strcpy(nmea_sentence, "$GPGGA,082623.000,2238.0069,N,11404.1439,E,1,08,1.2,45.6,M,0,M,,*7E\n");
if (parse_gps_nmea(nmea_sentence, &location) == 0) {
printf("Latitude: %.4f\n", location.latitude);
printf("Longitude: %.4f\n", location.longitude);
printf("Altitude: %.1f\n", location.altitude);
printf("Satellites: %d\n", location.satellites);
} else {
printf("Invalid NMEA data!\n");
}
return 0;
}
// 该函数仅支持解析格式为'$GPGGA'的NMEA数据,且仅提取了常用的定位信息字段。 // 如果需要解析其他类型的NMEA数据或提取更多的字段,需要根据具体需求进行修改。
原文地址: https://www.cveoy.top/t/topic/nqFO 著作权归作者所有。请勿转载和采集!