用GPS模块校准系统时间

news/2025/2/22 0:48:01/

  //========================================================================
  //TITLE:
  //    用GPS模块校准系统时间
  //AUTHOR:
  //    norains
  //DATE:
  //    Friday 04-September-2009
  //Environment:
  //    WINDOWS CE 5.0
  //========================================================================

    众所周知,大家在使用XP桌面系统的时候,我们可以通过设置时间的属性,让其通过互联网进行校准,这样我们就不会为不准点而烦恼了。但这在大部分车载设备上就行不通,因为它们往往不会带有网络模块,更不用提在大马路上还要随处可见无线网络。
   
    条条大路通罗马。用不了互联网,那我们就用GPS模块的数据咯。做过GPS导航的人应该都不陌生,GPS模块会每隔1秒就会不停地往串口发送数据。其中数据包含的信息可就多了,经度,维度,速度,当然还少不了我们所需要的时间。
   
    本文的主题是时间,所以GPS模块的其它数据就随它去吧,我们只要知道带有$GPRMC标志开头的数据包含时间信息即可。
   
    我们先来看看$GPRMC数据各位代表的意义.
   
    $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
  <1> UTC时间,hhmmss(时分秒)格式
  <2> 数据状态,A=有效,V=无效
  <3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
  <4> 纬度半球N(北半球)或S(南半球)
  <5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
  <6> 经度半球E(东经)或W(西经)
  <7> 地面速率(000.0~999.9节,前面的0也将被传输)
  <8> 地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输)
  <9> UTC日期,ddmmyy(日月年)格式
  <10> 磁偏角(000.0~180.0度,前面的0也将被传输)
  <11> 磁偏角方向,E(东)或W(西)
  <12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

    在这12组数据之中,我们需要用到的是2和9。第9项大家都好理解,其中保存的是时间数据嘛,不用它还用谁呢?可第2项呢?为什么会有无效或有效这两种状态呢?其实,对于GPS模块来说,并不是检测到数据有效才会往外发送数据;而是不管三七二十一,有效还是无效,源源不断地往外发送数据。判断数据是否有效的唯一方式,就是查看第二项是否为A。
   
    于是,我们的软件流程就很简单明了:不停地从GPS模块中读取数据,然后判断标志头是否为$GPRMC,接着再查看第二项是否为A,如果为A有效,直接提取第9项UTC时间,通过SetSystemTime进行设置。
   
    以下给出一个从GPS数据中提取UTC时间并转化为SYSTEMTIME结构的函数代码:

 

    代码没有什么出彩的地方,唯一需要注意一点的是,因为年是以两位数表示,并且现在已经过了2000年,所以在代码中简单性地手工加了2000。我无法保证这代码永远正确,但至少在2099年之前还是能正常运作的。:-)

 

    调用很简单:

 

   还有一点需要注意的是,在WINCE中,串口是独占设备。也就是说,如果你在程序中打开了串口进行数据的监控,那么在你进入导航软件之前,必须要在程序中将串口关闭。还有另一种方法,就是用虚拟串口的方式,让多个进程能同时获取数据(请见该文:http://blog.csdn.net/norains/archive/2009/03/28/4032257.aspx#1140231)。
  
   这校准时间的方式还有一个非常变态的用法。大家都知道,CPU都会有一个32.768KHZ的RTC晶振,用来给CPU准确计时。如果该晶振不工作,那么系统时钟将会停止。这时候,你就可以每隔1秒钟通过读取GPS数据对系统时间进行设置,让时间看起来真的是在不停变动一样。不过,这样方式比较耗费资源,实用性也不大,偶尔无聊时可为之。


http://www.ppmy.cn/news/877403.html

相关文章

谷歌原生GPS定位处理【locationProvider】

加权限&#xff1a; <uses-permission android:name"android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name"android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name"android.permission…

GPS开发、定位修改

GPS开发、定位修改 修改于 AOSP android7.1.1_r1 NMF26F openjdk8.0 Mint-linux nexus5x 原作者:https://blog.csdn.net/aggresss/article/details/54323034 指出文中错误&#xff08;自己编译时候遇到的&#xff09;并修正 固件共享出来是不可能的&#xff0c;谁知道我的固件…

Android-Framework-GPS定位原理和修改

一、 Android定位功能原理概述 1.1 Android三种定位提供方式。 Android 应用层获取定位可以通过三种定位提供方式&#xff1a;gps&#xff0c;network&#xff0c;passive。 gps –>&#xff08;GPS&#xff0c;AGPS&#xff09;&#xff1a; GPS位置提供者的名称。该提供商…

Autoware 中 GPS 定位问题

本文转载自 [1] isl_qdu. Autoware 中 GPS 定位问题 [EB/OL]. https://www.jianshu.com/p/9bfdd11c3fa8, 2019-03-04/2021-09-25. [2] LeonHuo. Autoware 笔记 No. 5——基于GNSS的定位 [EB/OL]. https://www.cnblogs.com/hgl0417/p/11504570.html, 2019-09-11/2021-09-25. 一…

【微信小程序-uniapp】CustomDialog 居中弹窗组件

1. 效果图 2. 组件完整代码 <template><uni-popup :ref="ref" type="center" @change

ES6: Proxy概念及用法

Proxy如其名&#xff0c; 它的作用是在对象和和对象的属性值之间设置一个代理&#xff0c;获取该对象的值或者设置该对象的值&#xff0c; 以及实例化等等多种操作&#xff0c; 都会被拦截住&#xff0c; 经过这一层我们可以统一处理&#xff0c;我们可以认为它就是“代理器” …

【转】nbsp;多姿多彩的宜兴话

http://hi.baidu.com/&#xfffd;lounge/blog/item/e64710cd66da6394c91768e1.html 【转】 多姿多彩的宜兴话 源于生活&#xff0c;传承古音&#xff0c;吸收外来语&#xff0c;合音&#xff0c;多音&#xff0c;文白两读&#xff0c;方言岛&#xff0c;构成了一个多姿多彩的…

服装店起名的知识

服装店起名第一要考虑服装本身用户群体的定位&#xff0c;如女装男装童装&#xff0c;不同用户定位肯定名字不一定&#xff0c;其次服装店起名要考虑名字好记&#xff0c;好读&#xff0c;有利于店铺品牌的传播和推广&#xff0c;如何服装店取名怎么样&#xff0c;有什么名字来…