MTK MT33xx型GPS的NMEA协议解析实例
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协议解析实例的更多相关文章
- GPS之NMEA协议20160526
NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式.现在已经成为GPS导航设备统一的RTCM(Rad ...
- nmea协议
NMEA协议 信息类型为: GPGSV:可见卫星信息 GPGLL:地理定位信息 GPRMC:推荐最小定位信息 GPVTG:地面速度信息 GPGGA:GPS定位信息 GPGSA:当前卫星信息 1. Gl ...
- SYN2306C型 GPS北斗授时导航接收机
SYN2306C型 GPS北斗授时导航接收机 北斗对时系统北斗标准同步时钟北斗卫星校时器使用说明视频链接: http://www.syn029.com/h-pd-222-0_310_36_-1.htm ...
- SYN2306B型 GPS北斗双模授时板
SYN2306B型 GPS北斗双模授时板 产品概述 SYN2306B型GPS北斗双模授时板是由西安同步电子科技有限公司精心设计.自行研发生产的一款双模授时板卡,接收北斗或者GPS北斗混合授时卫星信号, ...
- SYN2306A型 GPS北斗双模授时板
SYN2306A型 GPS北斗双模授时板 北斗gps时钟北斗授时设备北斗时钟同步系统使用说明视频链接: http://www.syn029.com/h-pd-211-0_310_36_-1.html ...
- ts 协议解析
pes : http://wenku.baidu.com/link?url=KjcA0qXqZ1bWVQTa8i1YOmygofldSQL7Pjj-zGRw1e_6_LFmVLo5DIWF0SNwVn ...
- [转]netty对http协议解析原理
本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...
- NMEA协议 上位机 C# (转)
源:NMEA协议 上位机 c# 前些时间写做了两款用NMEA协议的上位机,在这里做一个总结和记录.和大家分享,也为了以后不会忘记. NMEA协议总体来说,相对简单,是气象上比较成熟的协议. 主要有以下 ...
- twemproxyRedis协议解析探索——剖析twemproxy代码正编
这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...
随机推荐
- Nginx 访问日志轮询切割
Nginx 访问日志轮询切割脚本 #!/bin/sh Dateformat=`date +%Y%m%d` Basedir="/application/nginx" Nginxlog ...
- SCNU ACM 2016新生赛初赛 解题报告
新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...
- 为什么 C++ 中成员函数指针是 16 字节?
当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小.例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录: Pushes a ...
- Spring之BeanFactory及Bean生命周期
1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...
- 台式机装原版Win2008R2
台式机装原版Win2008R2 坑了老半天,总结出几点 1,系统os下载: http://msdn.itellyou.cn/ 注:其他地方下载的,装后发现不是起不来就是驱动装不了. 2,u盘里放个压缩 ...
- Linux 进程与线程六
//线程间的通信 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <e ...
- 安装CentOS7文字界面版后,无法联网,用yum安装软件提示 cannot find a valid baseurl for repo:base/7/x86_64 的解决方法
*无法联网的明显表现会有: 1.yum install出现 Error: cannot find a valid baseurl or repo:base 2.ping host会提示unknown ...
- EF里的继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子
本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...
- [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...
- [LeetCode] Largest Rectangle in Histogram 直方图中最大的矩形
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...