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命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...
随机推荐
- iOS系列 基础篇 06 标签和按钮 (Label & Button)
iOS系列 基础篇 06 标签和按钮 (Label & Button) 目录: 标签控件 按钮控件 小结 标签和按钮是两个常用的控件,下面咱们逐一学习. 1. 标签控件 使用Single Vi ...
- Oracle常用函数汇总
在Oracle OCP考试中,相当一部分知识点涉及到对于Oracle常见函数的考查.尽管Oracle官方文档SQL Language Reference中Functions一章内列举了所有Oracle ...
- linux 安装mysql数据库——tar.gz包解压安装法
mysql数据库有多种安装方式,本文只介绍在Linux服务器上的tar.gz包解压安装法, 先通过mysql官网或者网络资源下载 mysql-5.7.3-m13-linux-glibc2.5-x86_ ...
- java工具类之Graphics
利用重写paint()方法绘画出一个坐标轴: package huaxian; import java.awt.Color; import java.awt.FlowLayout; import ja ...
- [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)
Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义: 文本:由0个或 ...
- 安全测试 - CSRF攻击及防御
CSRF(Cross-site request forgery跨站请求伪造) 尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左.XSS利用站点内的信任用户,而CSRF则通过伪 ...
- phabricator-zh_CN汉化包
https://github.com/wanthings/phabricator-zh_CN 之前公司用这个做任务管理.可以将一些安排计划等指派给某个人跟进进度. 这个系统都是英文的,这是个缺憾.我找 ...
- flex自适应高度内容高度超出容器高度自动出现滚动条的问题
在容器中设置 flex-grow:2; overflow-y:auto;overflow-x:hidden;容器高度自适应. 内容高度不固定,无法出现滚动条,然后在容器中添加height:0,出现滚动 ...
- [LeetCode] Longest Absolute File Path 最长的绝对文件路径
Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...
- [LeetCode] Binary Tree Paths 二叉树路径
Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...