|
发表于 2022-11-16 21:39:46
|
显示全部楼层
/**
* @brief nmea_decode_test 解码GPS模块信息
* @param 无
* @retval 无
利用nmealib解析GPS模块的输出结果大致可以分为三步,
第一步定义和初始化GPS信息结构体和解析载体结构体,
第二步调用nmea_parse函数完成解析工作,
第三步释放解析载体所占用的内存空间。
*/
int nmea_decode_test(void)
{
nmeaINFO info; //GPS解码后得到的信息
nmeaPARSER parser; //解码时使用的数据结构
//nmeaPARSER是解析nmea所需要的一个结构。
uint8_t new_parse=0; //是否有新的解码数据标志
nmeaTIME beiJingTime; //北京时间
/* 设置用于输出调试信息的函数 */
nmea_property()->trace_func = &trace;
nmea_property()->error_func = &error;
/* 初始化GPS数据结构 */
nmea_zero_INFO(&info);/*对nmeaINFO这个结构中数据进行清零操作,
使用nmea_time_now函数对其中utc时间赋一个初值,初值就是当前的系统时间,
如果没有从nmea中解析出时间信息,那么最后的结果就是你当前的系统时间。
而nmeaINFO中的sig、fix分别是定位状态和定位类型
*/
nmea_parser_init(&parser);//nmeaPARSER结构做初始化,以nmea_parser_init和nmea_parser_destroy需要成对出现。
while(1)
{
if(GPS_HalfTransferEnd) /* 设置半传输完成标志位
接收到GPS_RBUFF_SIZE一半的数据 */
{
/* 进行nmea格式解码 */
/*
调用nmea_parse函数对nmea语句进行解析
原型:
int nmea_parse(
nmeaPARSER *parser,
const char *buff,
int buff_sz,
nmeaINFO *info
)
这个函数有四个参数,分别是nmeaPARSER指针,buff对应需要解析的nmea语句,buff_sz为nmea语句的长度,nmeaINFO指针
*/
nmea_parse(&parser, (const char*)&gps_rbuff[0], HALF_GPS_RBUFF_SIZE, &info);
//nmeaPARSER指针,需要解析的BUFF, 串口接收缓冲区一半512/2,nmeaINFO指针
GPS_HalfTransferEnd = 0; //清空标志位
new_parse = 1; //设置解码消息标志
}
else if(GPS_TransferEnd) /* 接收到另一半数据 */
{
nmea_parse(&parser, (const char*)&gps_rbuff[HALF_GPS_RBUFF_SIZE], HALF_GPS_RBUFF_SIZE, &info);
GPS_TransferEnd = 0;
new_parse =1;
}
if(new_parse ) //有新的解码消息
{
/* 对解码后的时间进行转换,转换成北京时间 */
GMTconvert(&info.utc,&beiJingTime,8,1);
/* 输出解码得到的信息 */
printf("\r\n时间%d,%d,%d,%d,%d,%d\r\n", beiJingTime.year+1900, beiJingTime.mon+1,beiJingTime.day,beiJingTime.hour,beiJingTime.min,beiJingTime.sec);
printf("\r\n纬度:%f,经度%f\r\n",info.lat,info.lon);
printf("\r\n正在使用的卫星:%d,可见卫星:%d",info.satinfo.inuse,info.satinfo.inview);
printf("\r\n海拔高度:%f 米 ", info.elv);
printf("\r\n速度:%f km/h ", info.speed);
printf("\r\n航向:%f 度", info.direction);
new_parse = 0;
}
}
/* 释放GPS数据结构 */
// nmea_parser_destroy(&parser);
// return 0;
} |
|