//======================================================================
//【版权】(C) COPYRIGHT 2009 天祥电子 WWW.TXMCU.COM ALL RIGHTS RESERVED
//【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
//======================================================================
//=============================================================
//维护记录:2009-8-23 v1.0 by xgc
// 2010-1-30 v1.1 by xgc
// 增加函数:Get_Int_Number,Str_To_Int,GPS_GSV_Parse
//
//代码作者: 相广超 xgc94418297.blog.163.com
//=============================================================
#include "GPS.h"
#include <string.h>
static uchar GetComma(uchar num,char* str);
static int Get_Int_Number(char *s);
static double Get_Double_Number(char *s);
static float Get_Float_Number(char *s);
static void UTC2BTC(DATE_TIME *GPS);
//====================================================================//
// 语法格式:int GPS_RMC_Parse(char *line, GPS_INFO *GPS)
// 实现功能:把gps模块的GPRMC信息解析为可识别的数据
// 参 数:存放原始信息字符数组、存储可识别数据的结构体
// 返 回 值:
// 1: 解析GPRMC完毕
// 0: 没有进行解析,或数据无效
//====================================================================//
int GPS_RMC_Parse(char *line,GPS_INFO *GPS)
{
uchar ch, status, tmp;
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
ch = buf[5];
status = buf[GetComma(2, buf)];
if (ch == 'C') //如果第五个字符是C,($GPRMC)
{
if (status == 'A') //如果数据有效,则分析
{
GPS -> NS = buf[GetComma(4, buf)];
GPS -> EW = buf[GetComma(6, buf)];
GPS->latitude = Get_Double_Number(&buf[GetComma(3, buf)]);
GPS->longitude = Get_Double_Number(&buf[GetComma( 5, buf)]);
GPS->latitude_Degree = (int)GPS->latitude / 100; //分离纬度
lati_cent_tmp = (GPS->latitude - GPS->latitude_Degree * 100);
GPS->latitude_Cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - GPS->latitude_Cent) * 60;
GPS->latitude_Second = (int)lati_second_tmp;
GPS->longitude_Degree = (int)GPS->longitude / 100; //分离经度
long_cent_tmp = (GPS->longitude - GPS->longitude_Degree * 100);
GPS->longitude_Cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - GPS->longitude_Cent) * 60;
GPS->longitude_Second = (int)long_second_tmp;
speed_tmp = Get_Float_Number(&buf[GetComma(7, buf)]); //速度(单位:海里/时)
GPS->speed = speed_tmp * 1.85; //1海里=1.85公里
GPS->direction = Get_Float_Number(&buf[GetComma(8, buf)]); //角度
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);
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;
UTC2BTC(&GPS->D);
return 1;
}
}
return 0;
}
//====================================================================//
// 语法格式:int GPS_GGA_Parse(char *line, GPS_INFO *GPS)
// 实现功能:把gps模块的GPGGA信息解析为可识别的数据
// 参 数:存放原始信息字符数组、存储可识别数据的结构体
// 返 回 值:
// 1: 解析GPGGA完毕
// 0: 没有进行解析,或数据无效
//====================================================================//
int GPS_GGA_Parse(char *line,GPS_INFO *GPS)
{
uchar ch, status;
char *buf = line;
ch = buf[4];
status = buf[GetComma(2, buf)];
if (ch == 'G') //$GPGGA
{
if (status != ',')
{
GPS->height_sea = Get_Float_Number(&buf[GetComma(9, buf)]);
GPS->height_ground = Get_Float_Number(&buf[GetComma(11, buf)]);
return 1;
}
}
return 0;
}
//====================================================================//
// 语法格式:int GPS_GSV_Parse(char *line, GPS_INFO *GPS)
// 实现功能:把gps模块的GPGSV信息解析为可识别的数据
// 参 数:存放原始信息字符数组、存储可识别数据的结构体
// 返 回 值:
// 1: 解析GPGGA完毕
// 0: 没有进行解析,或数据无效
//====================================================================//
int GPS_GSV_Parse(char *line,GPS_INFO *GPS)
{
uchar ch, status;
char *buf = line;
ch = buf[5];
status = buf[GetComma(2, buf)];
if (ch == 'V') //$GPGSV
{
GPS->satellite = Get_Int_Number(&buf[GetComma(3, buf)]);
return 1;
}
return 0;
}
//====================================================================//
// 语法格式: static int Str_To_Int(char *buf)
// 实现功能: 把一个字符串转化成整数
// 参 数:字符串
// 返 回 值:转化后整数值
//====================================================================//
static int Str_To_Int(char *buf)
{
int rev = 0;
int dat;
char *str = buf;
while(*str != '\0')
{
switch(*str)
{
case '0':
dat = 0;
break;
case '1':
dat = 1;
break;
case '2':
dat = 2;
break;
case '3':
dat = 3;
break;
case '4':
dat = 4;
break;
case '5':
dat = 5;
break;
case '6':
dat = 6;
break;
case '7':
dat = 7;
break;
case '8':
dat = 8;
break;
case '9':
dat = 9;
break;
}
rev = rev * 10 + dat;
str ++;
}
return rev;
}
//====================================================================//
// 语法格式: static int Get_Int_Number(char *s)
// 实现功能:把给定字符串第一个逗号之前的字符转化成整型
// 参 数:字符串
// 返 回 值:转化后整数值
//====================================================================//
static int Get_Int_Number(char *s)
{
char buf[10];
uchar i;
int rev;
i=GetComma(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
rev=Str_To_Int(buf);
return rev;
}
//====================================================================//
// 语法格式: static float Str_To_Float(char *buf)
// 实现功能: 把一个字符串转化成浮点数
// 参 数:字符串
// 返 回 值:转化后单精度值
//====================================================================//
static float Str_To_Float(char *buf)
{
float rev = 0;
float dat;
int integer = 1;
char *str = buf;
int i;
while(*str != '\0')
{
switch(*str)
{
case '0':
dat = 0;
break;
case '1':
dat = 1;
break;
case '2':
dat = 2;
break;
case '3':
dat = 3;
break;
case '4':
dat = 4;
break;
case '5':
dat = 5;
break;
case '6':
dat = 6;
break;
case '7':
dat = 7;
break;
case '8':
dat = 8;
break;
case '9':
dat = 9;
break;
case '.':
dat = '.';
break;
}
if(dat == '.')
{
integer = 0;
i = 1;
str ++;
continue;
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
博客地址:https://blog.csdn.net/qq_35654286/article/details/138824822?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22138824822%22%2C%22source%22%3A%22qq_35654286%22%7D 51单片机GPS+sim800c GSM定位短信LCD1602液晶显示 原理图+PCB+源码 51单片机GPS+sim800c GSM定位短信LCD1602液晶显示 原理图+PCB+源码 51单片机GPS+sim800c GSM定位短信LCD1602液晶显示 原理图+PCB+源码
资源推荐
资源详情
资源评论
收起资源包目录
51单片机GPS+sim800c GSM定位短信LCD1602液晶显示程序.7z (50个子文件)
51单片机GPS+sim800c GSM定位短信LCD1602液晶显示程序
GPS GSM.Sch 108KB
PCB1.PcbDoc 693KB
14GPS GSM定位短信程序
1、Keil 工程
GPS.h 907B
程序_uvopt.bak 7KB
程序_uvproj.bak 14KB
eeprom52.h.orig 3KB
程序.uvgui.Administrator 71KB
lcd.h 1KB
程序 87KB
lcd.c 6KB
STARTUP.LST 14KB
uart.h 819B
GPS.c.orig 12KB
main.OBJ 31KB
gsm.h 1KB
程序.SBR 54KB
GPS.LST 23KB
程序.uvgui_Administrator.bak 70KB
STARTUP.A51 6KB
gsm.OBJ 12KB
common.c 1KB
lcd.OBJ 21KB
程序.hex 20KB
lcd.LST 10KB
main.LST 15KB
config.h 58B
程序.uvproj 14KB
程序.plg 766B
GPS.OBJ 34KB
common.h 426B
程序.uvgui.lxy 70KB
eeprom52.h 3KB
uart.LST 7KB
common.LST 3KB
gsm.c.orig 1KB
程序.build_log.htm 754B
uart.c 4KB
lcd.c.orig 5KB
GPS.c 14KB
uart.c.orig 4KB
STARTUP.OBJ 749B
程序.lnp 110B
uart.OBJ 13KB
common.OBJ 9KB
程序.MAP 99KB
main.c.orig 7KB
main.c 8KB
gsm.LST 3KB
程序.uvgui_lxy.bak 70KB
程序.uvopt 7KB
共 50 条
- 1
资源评论
森旺电子
- 粉丝: 7153
- 资源: 264
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 甘晴void:一位多才多艺的编程新星.zip
- 基于C++的App图标资源库设计源码 - libicon
- 基于Java的日记本应用程序设计源码 - Diary
- 基于C#的.NET模板引擎设计源码 - jntemplate
- 基于51单片机+AC24C04+LCD1602显示的电子密码锁程序源代码及电路仿真.zip
- 基于C++的图形共享内存轻量级设计源码 - graphic_surface_lite
- 深入解析指令调度与延迟分支.zip
- 基于STC15F104E系列单片机的EEPROM应用程序测试例程KEIL工程源码.zip
- 基于STC15F104E系列单片机的串口通讯应用程序测试例程KEIL工程源码.zip
- java-leetcode题解之第844题比较含退格的字符串.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功