GPS定位器源码分享(技术交流)

//********************************************************

//GPS包接收处理

//完整包为 "$GPRMC,054209.000,A,2232.9850,N,11404.9159,E,1.37,,080408,,,D*7F\0x0d\0x0a";

void GpsPacketParse(void)

{

u32 ulTmp;

unsigned char i, ucPos, tmp;

//GPS初始为无信号

GpsData.GpsSignalFlag = FALSE;

//校验数据包是否正确

GpsData.bGpsPacketRcvSuccess = FALSE;

if (CheckGpsPacket(ucGpsDataBuffer) != CHECK_SUCCESS)

{

return;

}

//只需要对"GPRMC"包进行处理

if (CompareStr(ucGpsDataBuffer, "GPRMC", 5) == TRUE)

{

ucPos = 13;

while (ucGpsDataBuffer[ucPos++] != ',') //查找时间后面的逗号

{

if (ucPos > 250)

{

return;

}

}

GetGpsTime();  //更新时间

if (ucGpsDataBuffer[ucPos] != 'A')

{

return;

}

//获取时间

//获取小时

GpsData.UTC_Time[0] = ucGpsDataBuffer[6];

GpsData.UTC_Time[1] = ucGpsDataBuffer[7];

GpsData.uiTime = CharToValue(ucGpsDataBuffer[6]);

GpsData.uiTime = GpsData.uiTime * 10 + CharToValue(ucGpsDataBuffer[7]);

GpsData.uiTime *= 3600;  // 1 Hour = 3600 Second

if (IsNumber(GpsData.UTC_Time, 2) == FALSE)

{

return;

}

//获取分钟

GpsData.UTC_Time[2] = ':';

GpsData.UTC_Time[3] = ucGpsDataBuffer[8];

GpsData.UTC_Time[4] = ucGpsDataBuffer[9];

GpsData.uiTime += CharToValue(ucGpsDataBuffer[8]) * 10 * 60;

GpsData.uiTime += CharToValue(ucGpsDataBuffer[9]) * 60;

if (IsNumber(GpsData.UTC_Time + 3, 2) == FALSE)

{

return;

}

//获取秒

GpsData.UTC_Time[5] = ':';

GpsData.UTC_Time[6] = ucGpsDataBuffer[10];

GpsData.UTC_Time[7] = ucGpsDataBuffer[11];

GpsData.uiTime += CharToValue(ucGpsDataBuffer[10]);

GpsData.uiTime += CharToValue(ucGpsDataBuffer[11]);

if (IsNumber(GpsData.UTC_Time + 6, 2) == FALSE)

{

return;

}

ucPos = 12;

while (ucGpsDataBuffer[ucPos++] != ',') //查找时间后面的逗号

{

if (ucPos > 250)

{

return;

}

}

while (ucGpsDataBuffer[ucPos++] != ',') //查找'A'后面的逗号

{

if (ucPos > 250)

{

return;

}

}

//获取维度

//保存未处理的纬度数据

for (i = 0; i < 9; i++)

{

GpsData.InitLatitude[i] = ucGpsDataBuffer[ucPos + i];

}

GpsData.Latitude[0] = ucGpsDataBuffer[ucPos++];

GpsData.Latitude[1] = ucGpsDataBuffer[ucPos++];

if (IsNumber(GpsData.Latitude, 2) == FALSE)

{

return;

}

GpsData.Latitude[2] = '.';

ulTmp = CharToValue(ucGpsDataBuffer[ucPos++]);

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

ucPos++;//'.'

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

ulTmp = ulTmp * 5 / 3;

i = ulTmp / 100000;

GpsData.Latitude[3] = ValueToChar(i);

i = ulTmp % 100000 / 10000;

GpsData.Latitude[4] = ValueToChar(i);

i = ulTmp % 10000 / 1000;

GpsData.Latitude[5] = ValueToChar(i);

i = ulTmp % 1000 / 100;

GpsData.Latitude[6] = ValueToChar(i);

i = ulTmp % 100 / 10;

GpsData.Latitude[7] = ValueToChar(i);

i = ulTmp % 10;

GpsData.Latitude[8] = ValueToChar(i);

if (IsNumber(GpsData.Latitude + 3, 6) == FALSE)

{

return;

}

while (ucGpsDataBuffer[ucPos++] != ',')

{

if (ucPos > 250)

{

return;

}

}

//维度指示符,指示北维或南维

GpsData.LatitudeIndicator = ucGpsDataBuffer[ucPos++];

ucPos++; //','

//获取经度

//保存未处理的经度数据

for (i = 0; i < 10; i++)

{

GpsData.InitLongitude[i] = ucGpsDataBuffer[ucPos + i];

}

GpsData.Longitude[0] = ucGpsDataBuffer[ucPos++];

GpsData.Longitude[1] = ucGpsDataBuffer[ucPos++];

GpsData.Longitude[2] = ucGpsDataBuffer[ucPos++];

if (IsNumber(GpsData.Longitude, 3) == FALSE)

{

return;

}

GpsData.Longitude[3] = '.';

ulTmp = CharToValue(ucGpsDataBuffer[ucPos++]);

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

ucPos++;//'.'

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

ulTmp = ulTmp * 5 / 3;

i = ulTmp / 100000;

GpsData.Longitude[4] = ValueToChar(i);

i = ulTmp % 100000 / 10000;

GpsData.Longitude[5] = ValueToChar(i);

i = ulTmp % 10000 / 1000;

GpsData.Longitude[6] = ValueToChar(i);

i = ulTmp % 1000 / 100;

GpsData.Longitude[7] = ValueToChar(i);

i = ulTmp % 100 / 10;

GpsData.Longitude[8] = ValueToChar(i);

i = ulTmp % 10;

GpsData.Longitude[9] = ValueToChar(i);

if (IsNumber(GpsData.Longitude + 4, 3) == FALSE)

{

return;

}

while (ucGpsDataBuffer[ucPos++] != ',')

{

if (ucPos > 250)

{

return;

}

}

//获取经度指示符

GpsData.LongitudeIndicator = ucGpsDataBuffer[ucPos++];

ucPos++;//','

if (ucGpsDataBuffer[ucPos] != ',')

{

//有速度

//获取速度

for (i = 0; i < 6; i ++)

{

GpsData.InitSpeed[i] = '0';

}

GpsData.InitSpeed[3] = '.';

tmp = 0;

while (ucGpsDataBuffer[ucPos + tmp] != '.')

{

tmp ++;

if (tmp > 3)

{

break;

}

}

for (i = 0; i < tmp; i ++)

{

GpsData.InitSpeed[3 - tmp + i] = ucGpsDataBuffer[ucPos + i];

}

GpsData.InitSpeed[4] = ucGpsDataBuffer[ucPos + tmp + 1];

ulTmp = CharToValue(ucGpsDataBuffer[ucPos++]);

while (ucGpsDataBuffer[ucPos] != '.')

{

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

}

ucPos++;//'.'

ulTmp = ulTmp * 10 + CharToValue(ucGpsDataBuffer[ucPos++]);

GpsData.uiSpeed = ulTmp * 10;  //uiSpeed * 1.852 / 100 = km/h

ulTmp = ulTmp * 1852;

ulTmp /= 1000;

GpsData.Speed[0] = ValueToChar(ulTmp / 1000);

GpsData.Speed[1] = ValueToChar(ulTmp % 1000 / 100);

GpsData.Speed[2] = ValueToChar(ulTmp % 100 / 10);

if (IsNumber(GpsData.Speed, 3) == FALSE)

{

return;

}

GpsData.Speed[3] = '.';

GpsData.Speed[4] = ValueToChar(ulTmp % 10);

if (IsNumber(GpsData.Speed + 4, 1) == FALSE)

{

return;

}

if ((DeviceInfo.CarAccWork == TRUE)

|| (GpsData.uiSpeed > 500))

{

AddSumMeter((ulTmp + 18) / 36);

}

else

{

for (i = 0; i < 5; i ++)

{

GpsData.Speed[i] = '0';

}

GpsData.Speed[3] = '.';

}

}

while (ucGpsDataBuffer[ucPos] != ',')

{

if (ucPos > 250)

{

return;

}

ucPos ++;

}

ucPos ++; //','

if (ucGpsDataBuffer[ucPos] != ',')

{

//有方向数据

for (i = 0; i < 6; i ++)

{

GpsData.Direction[i] = '0';

}

i = 0;

while (ucGpsDataBuffer[ucPos] != ',')

{

GpsData.Direction[i] = ucGpsDataBuffer[ucPos];

i ++;

ucPos ++;

if (i >= 6)

{

break;

}

}

}

ucPos ++; //','

//获取日期

GpsData.UTC_Date[0] = ucGpsDataBuffer[ucPos++];

GpsData.UTC_Date[1] = ucGpsDataBuffer[ucPos++];

if (IsNumber(GpsData.UTC_Date, 2) == FALSE)

{

return;

}

GpsData.UTC_Date[2] = '/';

GpsData.UTC_Date[3] = ucGpsDataBuffer[ucPos++];

GpsData.UTC_Date[4] = ucGpsDataBuffer[ucPos++];

if (IsNumber(GpsData.UTC_Date + 3, 2) == FALSE)

{

return;

}

GpsData.UTC_Date[5] = '/';

GpsData.UTC_Date[6] = ucGpsDataBuffer[ucPos++];

GpsData.UTC_Date[7] = ucGpsDataBuffer[ucPos++];

if (IsNumber(GpsData.UTC_Date + 6, 2) == FALSE)

{

return;

}

//收到一些正确包后把数据状态变新,

if (GpsData.bDataState == GPS_OLD_DATA)

{

GpsData.GpsRcvPacketCnt++;

if (GpsData.GpsRcvPacketCnt >= 8)

{

GpsData.bDataState = GPS_NEW_DATA;

GpsData.GpsRcvPacketCnt = 0;

}

}

//GPS有信号

GpsData.GpsSignalFlag = TRUE;

GpsData.SendGpsPacketValid = TRUE;

SpeedAlertData.NewGpsData = TRUE;

GeoFenceData.NewGpsData = TRUE;

GpsData.bTimeZoneCalibrate = FALSE;

//把字符型经维度转换成值型经维度

GpsData.ulLatitude  = StrToValue(GpsData.Latitude, 2);

GpsData.ulLatitude  = GpsData.ulLatitude * 1000000UL + StrToValue(GpsData.Latitude + 3, 6);

GpsData.ulLongitude = StrToValue(GpsData.Longitude, 3);

GpsData.ulLongitude = GpsData.ulLongitude * 1000000UL + StrToValue(GpsData.Longitude + 4, 6);

}

}

GPS定位器源码分享相关推荐

  1. 微信小程序——智能小秘“遥知之”源码分享(语义理解基于olami)

    微信小程序智能生活小秘书开发详解 >>>>>>>>>>>>>>>>>>>>> ...

  2. ios开发学习-手势交互(Gesture)效果源码分享

    qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...

  3. 《小印记》源码分享--极光推送服务器篇

    为什么80%的码农都做不了架构师?>>>    笔者这几天刚完成<小印记>的推送功能,今天特分享一下在做的过程中实际解决的问题.如果读者学到了有用的东西,希望能前往App ...

  4. 基于免费人脸识别的闸机开发及源码分享

    最近公司要开发一款人脸识别的闸机,就是在现有闸机上将一个小屏的识别装置,人脸识别成功后将闸机打开. 项目源码在 : https://gitee.com/panmingzhi/ArcSoftFace.g ...

  5. Android 亲测源码分享

    Android 亲测源码分享 一.优质视频教程 1.老罗Android开发视频教程(更多经典教程制作进行中) http://www.apkbus.com/android-94796-1-1.html ...

  6. 学会选择最适合自己的GPS定位系统源码

    源码大家都知道就是可以用来做二次开发做任何改动的代码,一般购买源码都是考虑到后期会做二次开发有增加修改功能模块等需求,没有源码是无法实现的. GPS定位系统源码有很多种,这里说的很多种是指不同用途的G ...

  7. python删除链表中重复的节点_Java编程删除链表中重复的节点问题解决思路及源码分享...

    一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4-&g ...

  8. php会员系统源码_b2b2c商城系统会员预存款架构及源码分享

    业务需求 可以为预存款充值,在支付订单时使用预存款支付功能 当预存款余额>商品订单总金额时,完全抵扣商品订单金额: 当预存款余额 架构 一. 充值 二. 数据结构 1.会员钱包表(es_memb ...

  9. 插件一:JAVA微信砍价活动源码分享[商品帮砍到0元,免费领取奖品]

    插件一:微信砍价活动源码分享 [商品帮砍到0元,免费领取奖品] 活动描述: 砍价活动即公众号向粉丝推广的0价赠商品(或优惠价购商品)活动,用户通过分享好友帮其砍价,可将价格从原价一路砍到底价,并抢得名 ...

最新文章

  1. multipart request_Request和Response
  2. SAP PI 适配器引擎
  3. js获取验证码倒计时效果
  4. 在Selenium中按TagName定位元素
  5. html 微信发送给朋友,H5链接分享给微信好友,显示标题、描述、缩略图
  6. Java对象转出json并过滤指定属性
  7. Python 异常后变量的赋值
  8. Python学习中出现的一些问题
  9. 从HttpClient3迁移到HttpClient4
  10. Nginx不解析PHP,无法打开PHP文件
  11. Autojs对接图灵机器人
  12. android sqlite英文文献,SQLite数据库外文文献翻译.doc
  13. obsutil相关 (桶相关操作Linux)
  14. yigo基础学习笔记5_yigo二次开发配置
  15. 查询自己名下所有微信账户
  16. OR(odd ratios)
  17. 1_linux简介基础
  18. MPEG音频编码三十年
  19. jQuery轮播图(详细注释)
  20. 网络协议分析(第二版)期末复习资料一

热门文章

  1. 常见光电器件的介绍(部分)
  2. 小米拆分松果成立独立的芯片企业,意欲何为?
  3. 源码阅读(34):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(4)
  4. [*****]深入理解计算机系统(修订版)
  5. 多语言跨境商城源码,出海跨境商城软件开发模式平台
  6. 昊客生活拼团开发笔记
  7. 智能工厂管控平台促进纳恩博生产升级与管理创新
  8. 《计算机科学与工程导论:基于IoT和机器人的可视化编程实践方法第2版》一第2章 机器人开发环境和VIPLE入门...
  9. 远程擦除数据是什么?
  10. 搞死虚拟机-80端口