1)解析实现

gps_main.c

#include <nmea/nmea.h>
#include <string.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h> #include "nrf_gpio.h"
#include "gps_main.h"
#include "main.h" #define GPS_PIN 27 static struct gps_t
{
char buf[];
uint8_t index;
enum gps_state_t
{
GPS_NULL,
START,
PAYLOAD,
END,
} gps_state;
} gps; void gps_on(void)
{
nrf_gpio_cfg_output(GPS_PIN);
nrf_gpio_pin_set(GPS_PIN);
memset(gps.buf,,sizeof(char)*);
gps.gps_state = START;
gps.index = ;
} void gps_off(void)
{
nrf_gpio_pin_clear(GPS_PIN);
} void gps_buf_fill_data(uint8_t cr)
{
switch (gps.gps_state)
{
case START:
if(cr == '$')
{
gps.buf[gps.index++] = cr;
gps.gps_state = PAYLOAD;
}
else gps.gps_state = START;
break; case PAYLOAD:
if(cr == '\r')
{
gps.gps_state = END;
}
gps.buf[gps.index++] = cr;
break; case END:
if(cr == '\n')
{
if( xSemaphoreGive( gpsSemaphore ) != pdTRUE )
{
}
gps.buf[gps.index] = cr;
}
break; default:
break;
}
} void gps_thread(void * arg)
{
nmeaINFO info;
nmeaPARSER parser; int size_nmeaINFO = sizeof(nmeaINFO);
int size_nmeaPARSER = sizeof(nmeaPARSER); nmea_zero_INFO(&info);
nmea_parser_init(&parser); static uint8_t gps_nmea_scanning = ;
static int inuse_value = ;
static int inview_value = ; gps_on(); for (;;)
{
if( xSemaphoreTake( gpsSemaphore, ( TickType_t ) ) )
{
switch (gps_nmea_scanning)
{
case :
if(strstr(gps.buf,"$GPRMC")!=NULL)
{
if ((nmea_parse(&parser, (char*)gps.buf, (int)strlen((char*)gps.buf), &info)) > )
{
printf("inuse %d\r\n",inuse_value);
printf("inview %d\r\n",inview_value);
printf("sig %d\r\n",info.sig);
printf("fix %d\r\n",info.fix);
printf("year %d\r\n",info.utc.year);
printf("mon %d\r\n",info.utc.mon);
printf("day %d\r\n",info.utc.day);
printf("hour %d\r\n",info.utc.hour);
printf("min %d\r\n",info.utc.min);
printf("sec %d\r\n",info.utc.sec);
printf("lon %.5f\r\n",info.lon);
printf("lat %.5f\r\n",info.lat);
printf("speed %.2f\r\n",info.speed);
}
gps_nmea_scanning = ;
}
break; case :
if(strstr(gps.buf,"$GPGGA")!=NULL)
{
/*
MTK的GPS模组GPGGA协议内容是14项,nmealib库是解析的12项,这里手动解算inuse
if ((nmea_parse(&parser, (char*)gps.buf, (int)strlen((char*)gps.buf), &info)) > 0 )
*/
char inuse_buf[];
int count = , index = ;
for (index = ; index < strlen(gps.buf); ++index)
{
if (gps.buf[index] == ',')
++count;
if (count == )
break;
}
strncpy(inuse_buf, &gps.buf[index+], );
int n = atoi(inuse_buf);
inuse_value = n;
gps_nmea_scanning = ;
}
break; case :
if(strstr(gps.buf,"$GPGSV")!=NULL)
{
if ((nmea_parse(&parser, (char*)gps.buf, (int)strlen((char*)gps.buf), &info)) > )
{
inview_value = info.satinfo.inview;
}
gps_nmea_scanning = ;
}
break; default:
break;
} memset(gps.buf,,sizeof(char)*);
gps.index = ;
gps.gps_state = START;
}
}
}

gps_main.h

#ifndef GPS_MAIN_H__
#define GPS_MAIN_H__ #include <stdint.h> void gps_on(void);
void gps_off(void);
void gps_buf_fill_data(uint8_t cr); void gps_thread(void * arg); #endif

2)在串口接收函数中填充GPS缓存即可

gps_buf_fill_data(cr);

3)附件demo打包下载http://files.cnblogs.com/files/dong1/gps.rar

end

MTK MT33xx型GPS的NMEA协议解析实例的更多相关文章

  1. GPS之NMEA协议20160526

    NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式.现在已经成为GPS导航设备统一的RTCM(Rad ...

  2. nmea协议

    NMEA协议 信息类型为: GPGSV:可见卫星信息 GPGLL:地理定位信息 GPRMC:推荐最小定位信息 GPVTG:地面速度信息 GPGGA:GPS定位信息 GPGSA:当前卫星信息 1. Gl ...

  3. SYN2306C型 GPS北斗授时导航接收机

    SYN2306C型 GPS北斗授时导航接收机 北斗对时系统北斗标准同步时钟北斗卫星校时器使用说明视频链接: http://www.syn029.com/h-pd-222-0_310_36_-1.htm ...

  4. SYN2306B型 GPS北斗双模授时板

    SYN2306B型 GPS北斗双模授时板 产品概述 SYN2306B型GPS北斗双模授时板是由西安同步电子科技有限公司精心设计.自行研发生产的一款双模授时板卡,接收北斗或者GPS北斗混合授时卫星信号, ...

  5. SYN2306A型 GPS北斗双模授时板

    SYN2306A型 GPS北斗双模授时板 北斗gps时钟北斗授时设备北斗时钟同步系统使用说明视频链接: http://www.syn029.com/h-pd-211-0_310_36_-1.html ...

  6. ts 协议解析

    pes : http://wenku.baidu.com/link?url=KjcA0qXqZ1bWVQTa8i1YOmygofldSQL7Pjj-zGRw1e_6_LFmVLo5DIWF0SNwVn ...

  7. [转]netty对http协议解析原理

    本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...

  8. NMEA协议 上位机 C# (转)

    源:NMEA协议 上位机 c# 前些时间写做了两款用NMEA协议的上位机,在这里做一个总结和记录.和大家分享,也为了以后不会忘记. NMEA协议总体来说,相对简单,是气象上比较成熟的协议. 主要有以下 ...

  9. twemproxyRedis协议解析探索——剖析twemproxy代码正编

    这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...

随机推荐

  1. 原创 C++应用程序在Windows下的编译、链接:第三部分 静态链接(二)

    3.5.2动态链接库的创建 3.5.2.1动态链接库的创建流程 动态链接库的创建流程如下图所示: 在系统设计阶段,主要的设计内容包括:类结构的设计以及功能类之间的关系,动态链接库的接口.在动态链接库中 ...

  2. Reactor 模式的简单实现

    Reactor 模式简单实现 在网上有部分文章在描述Netty时,会提到Reactor.这个Reactor到底是什么呢?为了搞清楚Reactor到底是什么鬼,我写了一个简单的Demo,来帮助大家理解他 ...

  3. 用字体在网页中画Icon图标

    第一步,下载.IcoMoon网站选择字体图标并下载,解压后将fonts文件夹放在工程目录下.fonts文件夹内有四种格式的字体文件: 注:由于浏览器对每种字体的支持程度不一致,要想在所有浏览器中都显示 ...

  4. Azure机器学习入门(二)创建Azure机器学习工作区

    我们将开始深入了解如何使用Azure机器学习的基本功能,帮助您开始迈向Azure机器学习的数据科学家之路. Azure ML Studio (Azure Machine Learning Studio ...

  5. github如何删除一个(repository)仓库

    GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub.作为开源代码库以及版本控制系统,Github拥有140多万开发者用户.随着越 ...

  6. [LeetCode] Combinations 组合项

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  7. 关于GIT合并出错的记录

    今天给美术解决GIT资源冲突时碰到的问题,搞了挺长时间终于解决了.参看下面这个网址:http://www.bujichong.com/m/68 今天git一小部分代码发现出错了, 上网查了一下, 大体 ...

  8. 2016HDU校赛

    A: 真正的粉丝,就算不写题解也知道怎么做 B: 最基础的数位dp C: 贪心 易得要洗衣服的地位比要脱干衣服的地位高,于是先尽可能的按10件洗衣服,最后剩下要洗的衣服数量就是0~9. 再分成0~3, ...

  9. JavaScript的基本语法

    1.脚本的基本结构如下: <script language="JavaScript"> <!--JavaScript语句:--> </script&g ...

  10. C/C++头文件区别

    在从C迁移到C++时,引用的头文件经常忘记是C的还是C++特有的 1. *.h   limits.h ctype.h 2. c* climits cctype [结尾不含.h] 3. 其余的都属于C+ ...