单片机解析GPS数据算法

发布者:谁与争锋1最新更新时间:2015-09-30 来源: eefocus关键字:单片机  GPS  数据算法 手机看文章 扫描二维码
随时随地手机看文章
单片机解析GPS数据非常简单,只要串口接收到一行字符串,传到解析函数里,再把解析到的字符串经过运算转成我们需要数据。
 
硬件平台:XC-GPS开发板+XC-STC单片机开发板
 
效果如下:
单片机解析GPS数据算法
 
单片机解析GPS数据算法
 
首先创建一个GPS数据结构体:
  1. typedef data struct{
  2.     double latitude; //经度
  3.     double longitude; //纬度
  4.     int latitude_Degree;    //度
  5.     int        latitude_Cent;   //分
  6.     int     latitude_Second; //秒
  7.     int longitude_Degree;    //度
  8.     int        longitude_Cent;  //分
  9.     int     longitude_Second; //秒
  10.     float     speed; //速度
  11.     float     direction; //航向
  12.     float     height; //海拔高度
  13.     int satellite;
  14.     U8     NS;
  15.     U8     EW;
  16.     DATE_TIME D;
  17. }GPS_INFO;
时间结构体:
  1. typedef struct{
  2.     int year; 
  3.     int month; 
  4.     int day;
  5.     int hour;
  6.     int minute;
  7.     int second;
  8. }DATE_TIME;
 
核心算法就是解析GPRMC数据,得到经纬度,日期时间,速度,航向:
  1. int GPS_RMC_Parse(char *line, GPS_INFO *GPS)
  2. {
  3.     U8 ch, status, tmp;
  4.     float lati_cent_tmp, lati_second_tmp;
  5.     float long_cent_tmp, long_second_tmp;
  6.     float speed_tmp;
  7.     char *buf line;
  8.     ch buf[5];
  9.     status buf[GetComma(2, buf)];
  10.  
  11.     if (ch == 'C') //如果第五个字符是C,($GPRMC)
  12.     {
  13.         if (status == 'A') //如果数据有效,则分析
  14.         {
  15.             GPS->NS buf[GetComma(4, buf)];
  16.             GPS->EW buf[GetComma(6, buf)];
  17.  
  18.             GPS->latitude Get_Double_Number(&buf[GetComma(3, buf)]);
  19.             GPS->longitude Get_Double_Number(&buf[GetComma(5, buf)]);
  20.  
  21.             GPS->latitude_Degree (int)GPS->latitude 100; //分离纬度
  22.             lati_cent_tmp (GPS->latitude GPS->latitude_Degree 100);
  23.             GPS->latitude_Cent (int)lati_cent_tmp;
  24.             lati_second_tmp (lati_cent_tmp GPS->latitude_Cent) 60;
  25.             GPS->latitude_Second (int)lati_second_tmp;
  26.  
  27.             GPS->longitude_Degree (int)GPS->longitude 100;    //分离经度
  28.             long_cent_tmp (GPS->longitude GPS->longitude_Degree 100);
  29.             GPS->longitude_Cent (int)long_cent_tmp; 
  30.             long_second_tmp (long_cent_tmp GPS->longitude_Cent) 60;
  31.             GPS->longitude_Second (int)long_second_tmp;
  32.  
  33.             speed_tmp Get_Float_Number(&buf[GetComma(7, buf)]); //速度(单位:海里/时)
  34.             GPS->speed speed_tmp 1.85; //1海里=1.85公里
  35.             GPS->direction Get_Float_Number(&buf[GetComma(8, buf)]); //角度            
  36.  
  37.             GPS->D.hour (buf[7] '0') 10 (buf[8] '0');        //时间
  38.             GPS->D.minute (buf[9] '0') 10 (buf[10] '0');
  39.             GPS->D.second (buf[11] '0') 10 (buf[12] '0');
  40.             tmp GetComma(9, buf);
  41.             GPS->D.day (buf[tmp 0] '0') 10 (buf[tmp 1] '0'); //日期
  42.             GPS->D.month (buf[tmp 2] '0') 10 (buf[tmp 3] '0');
  43.             GPS->D.year (buf[tmp 4] '0') 10 (buf[tmp 5] '0') 2000;
  44.  
  45.             UTC2BTC(&GPS->D);
  46.             
  47.             return 1;
  48.                
  49.     }
  50.     
  51.     return 0;
  52. }
line是串口接收的一行数据buf
 
GetComma函数作用是一行数据中第几个逗号后面那个字符在这行数据中的位置
 
Get_Double_Number函数作用是把给定字符串第一个逗号之前的字符转化成双精度型,在这里就是把代表经度和纬度的字符串转换成数字,同样的函数还有Get_Float_Number
 
UTC2BTC函数是将世界时间转换成北京时间(相差8小时)
 
在LCD显示程序中把GPS_INFO结构体的已经被赋值的变量显示到屏上相应的位置即可
 
还有一个GPGGA信息段可以提供海拔高度和卫星数量信息
  1. int GPS_GGA_Parse(char *line, GPS_INFO *GPS)
  2. {
  3.     U8 ch, status;
  4.     char *buf line;
  5.     ch buf[4];
  6.     status buf[GetComma(2, buf)];
  7.  
  8.     if (ch == 'G') //$GPGGA
  9.     {
  10.         if (status != ',')
  11.         {
  12.             GPS->height Get_Float_Number(&buf[GetComma(9, buf)]);
  13.             GPS->satellite Get_Int_Number(&buf[GetComma(7, buf)]);
  14.  
  15.             return 1;
  16.         }
  17.     }
  18.     
  19.     return 0;
  20. }

关键字:单片机  GPS  数据算法 引用地址:单片机解析GPS数据算法

上一篇:单片式以太网控制芯片W7100A / W7100 Debugger指南(二)
下一篇:单片机串行接口的控制与应用

推荐阅读最新更新时间:2024-03-16 14:33

MCS-51系列单片机实现PWM输出功能的方法解析
MCS-51系列单片机无PWM输出功能,可以采用定时器配合软件的方法实现,对精度要求不高的场合是非常实用的。采用高速光隔6N137输出,并将PWM的信号倒相。 一、 工作原理 二、PWM输出 1. 固定脉宽PWM输出 用T0定时器完成PWM输出,脉宽固定为65536us。T0定时器设置成16位定时器,PWM波形如图2所示。 程序清单:(12MHz) PwmData0;T0定时t1的初值(字) PwmData1;T0定时t2的初值(字) PwmF ;PWM输出标志 ;*************************** setb tr0;启动T0 …… ;T0中断服务程序 T0Int:JB,PwmF,PWMOUT ;PWM
[单片机]
对180度360度sg90舵机的使用经验+单片机程序
大部资料都是在网上找到网友大神所共享的,我只是在理解他们的资料上加上了自己的一些注解,在网上找了几种舵机的,刚接触有点懵,之后找得多了就理解了,想要控制一个硬件就要先了解这个硬件。这里有介绍180度舵机和360度舵机的具体使用,有网上大神的程序,这个更多的是一个网上对舵机使用的一个整合。如果若有不到之处,希望大家积极指出, 模拟舵机:需要不断的发送目的地PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要不断的发送90度的PWM信号直到到达指定位置才能停止。我们使用的SG90就是一个模拟舵机 数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信
[单片机]
对180度360度sg90舵机的使用经验+<font color='red'>单片机</font>程序
提升单片机技术的五大重要步骤
第一步:读一读MCS-51的教程,通过看书了解单片机的内部结构及指令、总线等; 第二步:参照书本上的部分原理图自己设计一个,例如:最小系统等; 第三步1:在电子市场上买一个万用试验板和相关元器件,单片机可选80s51或52(初学时元器件贵一点也无所谓的)焊接元器件; 第三步2:同时在网上下载一个keil软件,编写程序(用高级程序语言c或asm均可)并通过单步模拟仿真; 第四步:用编程器把编译的hex代码写入单片机中,通上电源看效果是否为设想的一样,否则再重复修改程序再烧写(一般单片机都可烧写上千次,所以不用担心它的寿命); 第五步:可以在片上加入RS232协议跟pc机通讯,pc上可先下载一个串口调试精灵实现串口调试,会VB或Vc的可
[单片机]
semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机
使用ITM机制实现调试stm32单片机,实现printf与scanf。 1. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosting)方式。 在pc上编写过C语言的人都知道,printf可以向控制台输出,scanf可以从控制台获取输入,这里的printf/scanf都是标准库函数,利用操作系统的这些函数,我们可以很方便的调试程序。在嵌入式设备上(如stm32单片机平台上)开发工具(如MDK/IAR)也都提供了标准库函,自然也提供了printf/scanf函数,那么这些函数是否可以使用呢? 问题来了,printf向哪里输出呢?并且大部分情况下,也没有键盘,又如何
[单片机]
程序的思考(从单片机到PC)
关于程序的执行,以前想的不多,没有意识到一个程序在运行时,从哪里读指令,数据又写在哪里。 从单片机上知道,在上电的那一刻,MCU的程序指针PC会被初始化为上电复位时的地址,从哪个地址处读取将要执行的指令,由此程序在MCU上开始执行(当然在调用程序的 main之前,还有一系列其他的的初始化要做,如堆栈的初始化,不过这些我们很少回去修改)。PC在上电时,和MCU差不多,不过读取的是BIOS,有它完成了很多初始化操作,最后,调用系统的初始化函数,将控制权交给了操作系统,于是我们看到了Windows,Linux系统启动了。如果将操作系统看作是在处理器上跑的一个很大的裸机程序(就是直接在硬件上跑的程序,因为操作系统就是直接跑在CPU上的,这样
[单片机]
KEIL-51单片机实现自定义bootloader,用于程序更新
本文原创作者: 少占鱼大神 关于8051的bootloader实现方式 一,基本硬件需求 要实现IAP功能,需要51单片机可以在程序里修改代码空间的Flash,或者至少可以修改用户程序区的Flash,新出的51大部分都能满足这个要求 二,空间划分 一般bootloader位于单片机代码空间的起始地址,用户程序在后面。这个需要根据实际的需求来决定,bootloader功能简单,就少占用一些,bootloader功能复杂的就多占用一些。除此之外,一般还要根据Flash的页为界线划分。附带的工程模板里,bootloader使用0x0000-0x0fff区间,用户程序使用0x1000以后的空间。 三,中断的处理 51单片机的中断入口一般位
[单片机]
KEIL-51<font color='red'>单片机</font>实现自定义bootloader,用于程序更新
单片机的状态机框架编写
在单片机裸机的编程方法中,状态机的方法是比较好的,经典的比如按键的检测判断等。 其实有很多地方可以使用这种思想。比如传感器的数据采集,因为单片机不可能一直等待着运行,那样的效率是很低的,通常都是结合fsm + timer的方式来提高CPU的使用率 一、传感器中使用fsm的方法。 大家都知道,ds18b20的采集是比较慢的,发送转换指令后,最慢需要等待720ms,这个时间有点太长了。简直不能忍受。 如下所示:我采用了11bit分辨率,0.125的分辨率足够了,作为温度参考而已。 The resolution of the temperature sensor is user - configurable to 9, 10,
[单片机]
解读新能源汽车设计的几个关键技术
  中国汽车行业继续稳坐全球汽车产销量第一的“宝座”,但随之而来的却是一连串的社会问题:原油对外依存度超过50%的国际公认安全警戒线;汽车尾气占城市废气超过65%…..新为全球解决传统能源汽车带来的环境问题和能源问题提供了最佳的机会,成为全球持续关注的热点。在近日举行的中国(重庆)汽车电子高峰论坛上,基于新能源汽车的电子设计也成为热点话题。   “其实,除了不一样的驱动方式,新能源汽车与传统汽车并无本质的区别,更佳的驾驶与乘坐体验和更高安全性依然是汽车设计的主要挑战。”富士通半导体(上海)有限公司市场总监王钰指出,“在舒适性和安全性上,视频技术获得越来越广泛的应用,而电机作为新能源汽车的核心部件,高效率、高性能的控制技术是实现舒
[汽车电子]
解读新能源汽车设计的几个关键技术
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved