用C语言写一个GPS模块解析函数
GPS模块解析函数的代码如下:
#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;
}
该函数将一段NMEA数据解析为GPS定位信息,主要包括纬度、经度、海拔高度和可见卫星数等字段。具体实现步骤如下:
- 判断NMEA数据是否合法,即以"$"开头、以"\n"结尾;
- 切分NMEA数据字段,获取纬度、经度、海拔高度和可见卫星数等信息;
- 对纬度和经度进行转换,将度分秒表示法转换为十进制度数表示法;
- 将纬度和经度方向进行判断,如果是南纬或西经则需要将其值变为负数;
- 判断定位质量指示符是否为有效值,如果小于1则为无效定位;
- 将解析后的GPS定位信息存储到结构体中,并返回0表示解析成功。
注意,该函数仅支持解析格式为"$GPGGA"的NMEA数据,且仅提取了常用的定位信息字段。如果需要解析其他类型的NMEA数据或提取更多的字段,需要根据具体需求进行修改
原文地址: https://www.cveoy.top/t/topic/caYY 著作权归作者所有。请勿转载和采集!