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. jTemplates部分语法介绍

    1.{#if} {#if |COND|}..{#elseif |COND|}..{#else}..{#/if} Examples: {#if 2*8==16} good {#else} fail {# ...

  2. Extjs5 tabs实例

    <%@ page language= "java" contentType ="text/html; charset=UTF-8"     pageEnc ...

  3. Linux Shell脚本逻辑操作符简介

    在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...

  4. 【只需3步】Linux php的安装与配置[源码安装]

    作者小波/QQ463431476欢迎转载! Linux:redhat 6/centos 6 继续上一篇笔记Apache的配置http://www.cnblogs.com/xiaobo-Linux/p/ ...

  5. Hash 函数及其重要性

    不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性.今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码. 申明 密码学 ...

  6. 《使用Hibernate开发租房系统》内部测试笔试题

    笔试总结 1.在Hibernate中,以下关于主键生成器说法错误的是( C). A.increment可以用于类型为long.short或byte的主键 B.identity用于如SQL Server ...

  7. POJ 1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9276   Accepted: 3924 ...

  8. 负margin的移位参考线

    同早年~ 问题描述 在xx项目中,羊城通卡号的输入框处使用了xx库中的实现方式,即将提示文字标签<label>通过负margin移位到<input>框的下面.静态时展现良好,j ...

  9. [LeetCode] Bulls and Cows 公母牛游戏

    You are playing the following Bulls and Cows game with your friend: You write a 4-digit secret numbe ...

  10. xwalk_core_library-15.44.384 .13.aar 百度云分享

    xwalk_core_library-15.44.384.13.aar 这玩意下载很慢 特意放到百度,需要的可以通过百度下载 http://pan.baidu.com/s/1nt0Cmbn 下完后放到 ...