NMEA是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的ASCII格式,逗点隔开数据流,数据流长度从30-100字符不等,通常以每秒间隔选择输出,最常用的格式为"GGA",它包含了定位时间,纬度,经度,高度,定位所用的卫星数,其他的有速度,跟踪,日期等。

NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等,说明如下:

$GPGGA(定位信息)
eg:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F
$GPGSA(当前卫星信息)
eg:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A
$GPGSV(可见卫星信息)
eg:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70
$GPVTG(地面速度信息)
eg:$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F
$GPGLL(地理定位信息)
$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D

以下以代码段来说明$GPGGA的解析过程,其他类推。假设已从串口读到字符串。

(1)结构体信息

typedef struct{
int year;
int month;
int day;
int hour;
int minute;
int second;
}date_time;
typedef struct{
date_time D;//时间
char status;        //接收状态
double  latitude;   //纬度
double longitude;  //经度
char NS;           //南北极
char EW;           //东西
double speed;      //速度
double high;       //高度
}GPS_INFO;

(2)得到指定序号的逗号位置,以解析各个定义段

static int GetComma(int num,char *str)
{
int i,j=0;
int len=strlen(str);
for(i=0;i<len;i++)
{
if(str[i]==',')j++;
if(j==num)return i+1;    //返回当前找到的逗号位置的下一个位置
}
return 0;
}

得到精度纬度等高精度数据

static double get_double_number(char *s)
{
char buf[128];
int i;
double rev;
i=GetComma(1,s);    //得到数据长度
strncpy(buf,s,i);
buf[i]=0;          //加字符串结束标志
rev=atof(buf);     //字符串转float
return rev;
}

将世界时转换为北京时间

static void UTC2BTC(date_time *GPS)
{
//***************************************************
//如果秒号先出,再出时间数据,则将时间数据+1秒
GPS->second++; //加一秒
if(GPS->second>59){
GPS->second=0;
GPS->minute++;
if(GPS->minute>59){
GPS->minute=0;
GPS->hour++;
}
}
//***************************************************
GPS->hour+=8;      //北京时间跟UTC时间相隔8小时
if(GPS->hour>23)
{
GPS->hour-=24;
GPS->day+=1;
if(GPS->month==2 ||GPS->month==4 ||GPS->month==6 ||GPS->month==9 ||GPS->month==11 ){
if(GPS->day>30){          //上述几个月份是30天每月,2月份还不足30
GPS->day=1;
GPS->month++;
}
}
else{
if(GPS->day>31){          //剩下的几个月份都是31天每月
GPS->day=1;
GPS->month++;
}
}
if(GPS->year % 4 == 0 ){//
if(GPS->day > 29 && GPS->month ==2){     //闰年的二月是29天
GPS->day=1;
GPS->month++;
}
}
else{
if(GPS->day>28 &&GPS->month ==2){        //其他的二月是28天每月
GPS->day=1;
GPS->month++;
}
}
if(GPS->month>12){
GPS->month-=12;
GPS->year++;
}
}
}

(3)解析GPS数据,以line作为传入的字符串数据,GPS是待赋值的全局变量。以下第一行是字符顺序号

//0      7  0   4 6   0     6 8 0        90         0  3      0        9  
//$GPRMC,091400,A,3958.9870,N,11620.3278,E,000.0,000.0,120302,005.6,W*62
//$GPGGA,091400,3958.9870,N,11620.3278,E,1,03,1.9,114.2,M,-8.3,M,,*5E

void gps_parse(char *line,GPS_INFO *GPS)
{
int i,tmp,start,end;
char c;
char* buf=line;
c=buf[5];
if(c=='C'){//"GPRMC"
GPS->D.hour   =(buf[ 7]-'0')*10+(buf[ 8]-'0');
GPS->D.minute =(buf[ 9]-'0')*10+(buf[10]-'0');
GPS->D.second =(buf[11]-'0')*10+(buf[12]-'0');
tmp = GetComma(9,buf);     //得到第9个逗号的下一字符序号
GPS->D.day    =(buf[tmp+0]-'0')*10+(buf[tmp+1]-'0');
GPS->D.month  =(buf[tmp+2]-'0')*10+(buf[tmp+3]-'0');
GPS->D.year   =(buf[tmp+4]-'0')*10+(buf[tmp+5]-'0')+2000;
//------------------------------
GPS->status   =buf[GetComma(2,buf)];        //状态
GPS->latitude =get_double_number(&buf[GetComma(3,buf)]);    //纬度
GPS->NS       =buf[GetComma(4,buf)];                //南北纬
GPS->longitude=get_double_number(&buf[GetComma(5,buf)]);    //经度
GPS->EW       =buf[GetComma(6,buf)];                //东西经
UTC2BTC(&GPS->D);                        //转北京时间
}
if(c=='A'){ //"$GPGGA"
GPS->high     = get_double_number(&buf[GetComma(9,buf)]);
}
}

显示解析结果

void show_gps(GPS_INFO *GPS)
{
printf("DATE     : %ld-%02d-%02d \n",GPS->D.year,GPS->D.month,GPS->D.day);
printf("TIME     :  %02d:%02d:%02d \n",GPS->D.hour,GPS->D.minute,GPS->D.second);
printf("Latitude : %10.4f %c\n",GPS->latitude,GPS->NS);
printf("Longitude: %10.4f %c\n",GPS->longitude,GPS->EW);
printf("high     : %10.4f \n",GPS->high);
printf("STATUS   : %c\n",GPS->status);
}

GPS的NMEA数据解析相关推荐

  1. linux nmea解析程序,GPS的NMEA数据解析

    NMEA是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的ASCII格式,逗点隔开数据流,数据流长度从30-100字符不 等,通常以每秒间隔选择输出,最常用的格式为"GGA ...

  2. 远程定位gps linux,GPS(NMEA)数据解析

    一.GPS定位信息 设置好gps模式,启动gps,正常的话在gps通路有NMEA数据上报,如下: $GPGSV,3,1,11,01,62,130,42,07,61,201,43,11,72,075,2 ...

  3. GPS使用记录NMEA数据解析、RTK定位以及ntrip协议

    目录 1. 概述 2. 泰斗GPS定位模组 3. RTK GPS定位 4. ntrip协议 5. 千寻 1. 概述 本文主要是记录下GPS相关的内容.最开始叫做<泰斗GPS使用记录>,那时 ...

  4. 【中科微北斗+GPS模块经纬度数据解析详细教程-附免费代码工程】

    中科微北斗+GPS模块经纬度数据解析详细教程-附免费代码工程 简介 准备工作 PC端需要用到的工具 代码下载地址 GD32F103C8T6最小系统板 代码实现 GD32串口引脚定义如下: 串口的初始化 ...

  5. GPS NMEA数据解析

    所有的带GPS的终端,都要通过串口接收GPS报文.然后通过解析GPS报文把相关的位置信息提供给用户.熟悉GPS报文,就基本能了解GPS相关信息 现在主要的GPS报文采用的是nmea 的数据格式. nm ...

  6. GPS :NEMA数据解析

    GPS 0183协议GGA.GLL.GSA.GSV.RMC.VTG解释 + 数据解析 每个时区跨15°经度.以0°经线为界向东向西各划出7.5°经度,作为0时区.即0时区的经度范围是7.5°W--7. ...

  7. GNSS定位nmea数据解析

    定位原理: 地球在一个三维坐标系中,每个卫星以固定的周期和轨迹绕地球运动,因此每个卫星在每个时刻的位置坐标可确定(由卫星星历数据可得),每个卫星以1ms的周期不断发出信号,包含时间以及星历数据等 信息 ...

  8. GPS(rinex格式)数据解析详细解读

    RINEX格式现如今已成为GPS测量应用中的标准数据格式,目前应用最为广泛.最普遍的是RINEX格式的第2个版本,该版本能够用于包括静态和动态GPS测量在内的不同观测模式数据.在该版本中定义了6种不同 ...

  9. GPS NMEA数据包解析

    GPS NMEA数据包解析 NMEA-0183是美国国家海洋电子协会为海用电子设备制定的标准格式.它包含了定位时间,纬度,经度,高度,定位所用的卫星数,DOP值,差分状态和校正时段等很多信息 一 通用 ...

最新文章

  1. oracle菜鸟学习之 分析函数-排序
  2. Java理论知识及面试题
  3. 【解题报告】Leecode 2059. 转化数字的最小运算数
  4. 5-1 unittest框架使用
  5. VM克隆之后启动eth0找不到eth0:unknown interface:no such device
  6. 前端求职简历模板,一投即过!
  7. 项目管理常用文档表格模板二
  8. CCNet: Criss-Cross Attention for Semantic Segmentation阅读笔记
  9. 公安部网络安全保卫局郭启全总工:《从实战出发,落实重要措施,保卫国家关键信息基础设施和大数据安全》
  10. Jmockit使用详解之Mocking
  11. php布道师,百度智能小程序宣布“布道师”计划 昭原集团加入合作阵营
  12. 快捷方式管理软件推荐
  13. 云服务器系统一键安装,一键安装服务器系统
  14. 猫眼电影MySQL数据库怎么写_MySQL简要分析猫眼电影TOP100榜
  15. Android wifi属性简介 及 wifi信息获取(wifi列表、配置信息
  16. 22-兔子生兔子问题
  17. android 多任务按钮,XDA大神推出Android多任务切换神器
  18. 电机的反电动势了解及步进电机的基本特性
  19. 2021年全球与中国腰椎间盘突出行业市场规模及发展前景分析
  20. java获取前四个季度结束日期_JAVA使用LocalDate获取当前日期所在季度的开始日期和结束日期...

热门文章

  1. 超详细Hexo博客搭建教程
  2. 洛谷P1562 还是N皇后(DFS+状态压缩+位运算)
  3. 和平发展数字化与传统行业
  4. 【个人喜好诗词之一】雨巷
  5. 我在上海乐字节学习java的第二十五天(持续更新中)
  6. 面经-中科创达(校招)
  7. 苹果cmsV10韩剧TV简约影视网站源码电脑和手机模板自适应
  8. 【CodeChef】【DP】Count Subsequences
  9. 三极管相关知识点释疑(二)
  10. linux备份文件到ftp上,Linux如何利用ssh传送文件至FTP空间进行备份