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定位信息,主要包括纬度、经度、海拔高度和可见卫星数等字段。具体实现步骤如下:

  1. 判断NMEA数据是否合法,即以"$"开头、以"\n"结尾;
  2. 切分NMEA数据字段,获取纬度、经度、海拔高度和可见卫星数等信息;
  3. 对纬度和经度进行转换,将度分秒表示法转换为十进制度数表示法;
  4. 将纬度和经度方向进行判断,如果是南纬或西经则需要将其值变为负数;
  5. 判断定位质量指示符是否为有效值,如果小于1则为无效定位;
  6. 将解析后的GPS定位信息存储到结构体中,并返回0表示解析成功。

注意,该函数仅支持解析格式为"$GPGGA"的NMEA数据,且仅提取了常用的定位信息字段。如果需要解析其他类型的NMEA数据或提取更多的字段,需要根据具体需求进行修改

用C语言写一个GPS模块解析函数

原文地址: https://www.cveoy.top/t/topic/caYY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录