GPS编码格式及C语言的解码代码

GPS导航电文编码与校验 导航电文包含卫星的时间和位置信息,是进行导航定位不可缺少的起算数据。导航电文,又称为数据码或 D 码,包含有关卫星的星历、卫星工作状态、时间系统、卫星钟运行状态等信息,是卫星信号的重要组成部分,也是用户利用卫星进行定位的数据基础。 1 编码及校验计算 根据 GPS ICD-200 规定,导航电文子帧以字为单位组成,字结构如图所示,每个字由24 位比特数据位和 6 比特的奇偶校验位组成。采用奇偶校验可以检验接受端和发送端数据是否一致,从而提高数据传输质量。下面给出传输导航电文的校验过程。 D1 = d. 阅读详情
 GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中。前面的代码只负责从串口接收数据并将其放置于缓存,在没有进一步处理之前缓存中是一长串字节流,这些信息在没有经过分类提取之前是无法加以利用的。因此,必须通过程序将各个字段的信息从缓存字节流中提取出来,将其转化成有实际意义的,可供高层决策使用的定位信息数据。同其他通讯协议类似,对GPS进行信息提取必须首先明确其帧结构,然后才能根据其结构完成对各定位信息的提取。对于本文所使用的GARMIN GPS天线板,其发送到计算机的数据主要由帧头、帧尾和帧内数据组成,根据数据帧的不同,帧头也不相同,主要有"$GPGGA"、"$GPGSA"、"$GPGSV"以及"$GPRMC"等。这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束。对于通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从"$GPRMC"帧中获取得到,该帧的结构及各字段释义如下:

  $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh

  <1> 当前位置的格林尼治时间,格式为hhmmss

  <2> 状态, A 为有效位置, V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗。

  <3> 纬度, 格式为ddmm.mmmm

  <4> 标明南北半球, N 为北半球、S为南半球

  <5> 径度,格式为dddmm.mmmm

  <6> 标明东西半球,E为东半球、W为西半球

  <7> 地面上的速度,范围为0.0到999.9

  <8> 方位角,范围为000.0到 359.9 度

  <9> 日期, 格式为ddmmyy

  <10> 地磁变化,从000.0到 180.0 度

  <11> 地磁变化方向,为E 或 W

  至于其他几种帧格式,除了特殊用途外,平时并不常用,虽然接收机也在源源不断地向主机发送各种数据帧,但在处理时一般先通过对帧头的判断而只对"$GPRMC"帧进行数据的提取处理。如果情况特殊,需要从其他帧获取数据,处理方法与之也是完全类似的。由于帧内各数据段由逗号分割,因此在处理缓存数据时一般是通过搜寻ASCII码"$"来判断是否是帧头,在对帧头的类别进行识别后再通过对所经历逗号个数的计数来判断出当前正在处理的是哪一种定位导航参数,并作出相应的处理。下面就是对缓存Data中的数据进行解帧处理的主要代码,本文在此只关心时间(日期和时间)和地理坐标(经、纬度):

for(int i=0;i  if(Data=='$') file://帧头,SectionID为逗号计数器
  SectionID=0;
  if(Data==10){ file://帧尾
}
 if(Data==',') file://逗号计数
  SectionID++;
 else {
  switch(SectionID){
   case 1: file://提取出时间
    m_sTime+=Data;
    break;
   case 2: file://判断数据是否可信(当GPS天线能接收到有3颗GPS卫星时为A,可信)
    if(Data=='A')
     GPSParam[m_nNumber].m_bValid=true;
     break;
   case 3: file://提取出纬度
     m_sPositionY+=Data;
     break;
   case 5: file://提取出经度
     m_sPositionX+=Data;
     break;
   case 9: file://提取出日期
     m_sDate+=Data;
     break;
     default:
     break;
  }
 }
}

  现在已将所需信息提取到内存,即时间、日期以及经纬度分别保存在CString型变量 m_sTime、m_Data、m_sPositionY和m_sPositionX中。在实际应用中往往要根据需要对其做进一步的运算处理,比如从GPS接收机中获得的时间信息为格林尼治时间,因此需要在获取时间上加8小时才为我国标准时间。而且GPS使用的WGS-84坐标系也与我国采用的坐标系不同,有时也要对此加以变换。而这些变换运算必须通过数值运算完成,因此需要将前面获取的字符型变量转化为数值型变量,这部分工作可放在检测到帧尾完成:

::strcpy(buf,m_sTime);
str.Format("%c%c",buf[0],buf[1]);
GPSParam[m_nNumber].m_nHour=(atoi(str)+8)%24; file://提取出小时并转化为24小时制北京时间
file://buf第2、3字节为分钟,4、5字节为秒,提取方法同上
……
::strcpy(buf,m_sDate);
str.Format("%c%c",buf[0],buf[1]); file://提取出月份
file://buf第2、3字节为天,4、5字节为年,提取方法同上
……
::strcpy(buf,m_sPositionY);
str.Format("%c%c",buf[0],buf[1]);
PositionValue=atoi(str);
str.Format("%c%c%c%c%c%c%c",buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8]);
GPSParam[m_nNumber].m_dPositionY=PositionValue*60+atof(str); file://提取出纬度
……
::strcpy(buf,m_sPositionX);
if(m_sPositionX.GetLength()==10) file://经度超过90度(如东经125度)
{
 str.Format("%c%c%c",buf[0],buf[1],buf[2]);
 PositionValue=atoi(str);
 str.Format("%c%c%c%c%c%c%c",buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9]);
 GPSParam[m_nNumber].m_dPositionX=PositionValue*60+atof(str); file://提取出经度(单位为分)
}
if(m_sPositionX.GetLength()==9) file://经度未超过90度(如东经89度)
{
 file://处理方法同上,只是buf的第0、1字节为度数,2~9为分数。
}


  到此为止,已将时间和经纬度信息提取到GPS结构数组GPSParam中的各个变量中去,后续的处理和高层决策可根据该结构中存储的数据作出相应的处理。
GPS卫星位置解算实战:从C语言代码到测绘应用(附完整源码解析) 本文详细解析了GPS卫星位置解算的C语言实现,涵盖广播星历解码、轨道参数计算和坐标系转换等核心模块。通过优化算法和工程实践,提升解算精度与性能,适用于测绘工程与导航定位领域。附完整源码解析,助力开发者快速掌握卫星位置解算技术。 阅读详情

相关推荐

基于GPS与地理围栏的车载预警系统设计与实现

地理围栏是一种基于位置服务的核心技术,它通过GPS等定位技术获取设备实时坐标,并与预设的地理边界进行比对,从而触发特定操作。其原理在于将物理空间与数字逻辑关联,实现空间感知与事件响应。这项技术的核心价值在于将位置数据转化为可执行的智能决策,广泛应用于车辆管理、资产追踪和智能提醒等场景。在车载预警领域,结合高精度GPS模块与本地电子眼数据库,通过实时计算车辆与监控点的距离和方向,可以实现精准的测速预警。系统采用STM32等微控制器作为处理核心,利用Haversine公式进行球面距离计算,并引入方向过滤算法以减

weixin_30889885的博客 422

GPS编码格式及C语言解码

有关磁偏角和地图定位的问题:     地图的方向:上北、下南、左西、右东是大多数地图的方向,但这可不是通用原则,如果地图上有方向标,可以通过方向标了解到这些。     地磁极是接近南极和北极的,但并不和南极、北极重合,一个约在北纬72°、 西经96°处;一个约在南纬70°、东经150°处。磁北极距地理北极大约相差1500km。现在磁北极的位置在加拿大北方,在一天中磁北极的位置也是不停的变动

jia0511的专栏 2533

SIM7020C模块综合技术资料与应用指南

SIM7020C是一款高性能的物联网通信模块,由上海移远通信技术股份有限公司生产。该模块支持多种通信技术,包括GSM/GPRS、WCDMA、LTE等多种网络模式,并且具备GPS定位功能,是物联网应用中常用的通信解决方案。SIM7020C模块的低功耗设计和紧凑尺寸非常适合于智能表计、远程监控、车载追踪等应用场景。AT命令是一种用于控制调制解调器和其他通信设备的命令语言,其名称源于“Attention”的缩写。AT命令集允许用户通过串行接口对设备进行配置、管理和通信控制。

weixin_42598278的博客 1135

gps编码WGS-84 火星编码GCJ-02 转码,解决微信公众号定位不准确问题。

&lt;?php /** * 微信接口处理类 * * * @copyright (C) 2013-2018 XPHP * @version 2018-04-06 * @author 小疯 */ class Gps { private $PI = 3.14159265358979324; private $x_pi = 0; public function _...

绝地码农 2174

GPS程序C语言源代码

GPS程序C语言源代码,GPS程序C语言源代码,GPS程序C语言源代码。

GPSC语言代码

很全的关于gps测量的代码,包含通信,基线解算以及gis的应用

c语言解码GPS--实现篇

通过自己这几天的努力终于把GPS数据全部进行了解码,相信看了我的日志的人也期待了好久,资源在于分享,才能获得进步;相对于网上直接调用接口不同的是从C的方向解决问题能让问题更加的清晰,本设计芯片采用的是联星的CC550-BG模块,满足大多数芯片性能,系统是在LINUX系统下面实现,选用ttyS0节点,根据不同借口,串口线选择的是RS-232,相信大家也有所了解,详细的请看我代码,都有详细的解释,希望

jia0511的专栏 1万+

GPS解码显示相关的代码

GPS解码显示相关的代码,可以用来了解gps 的相关电文的形式,解码显示,自己调理调理,也是增强能力的方式,可用

GPS编码格式及C语言解码 .

GPS编码格式及C语言解码 引自http://www.sciencenet.cn/m/user_content.aspx?id=260661 后续我会把完整代码公布出来,现在在测试阶段,请大家关注! 有关磁偏角和地图定位的问题:      地图的方向:上北、下南、左西、右东是大多数地图的方向,但这可不是通用原则,如果地图上有方向标,可以通过方向标了解到这些。      地磁

jia0511的专栏 1730

BINEX格式介绍与GPS数据解码编码流程

Binex 是一种以二进制方式储存 GNSS 观测数据的格式,其巧妙的结构能尽可能的减小文件大小。

C语言的读取GPS源码

C语言的读取GPS源代码,代码在51单片机上调试通过,内有原理图

PHP安卓获取gpgga,科学网—GPS编码格式及C语言解码 - 王红旗的博文

有关磁偏角和地图定位的问题:地图的方向:上北、下南、左西、右东是大多数地图的方向,但这可不是通用原则,如果地图上有方向标,可以通过方向标了解到这些。地磁极是接近南极和北极的,但并不和南极、北极重合,一个约在北纬72°、西经96°处;一个约在南纬70°、东经150°处。磁北极距地理北极大约相差1500km。现在磁北极的位置在加拿大北方,在一天中磁北极的位置也是不停的变动,它的轨迹大致为一椭圆形,磁...

weixin_39686353的博客 351

瑶芯技术分享 | 三相维也纳PFC功率器件损耗分析

电流的流通路径为:从A相电网正极流出,经过电感La,再经过二极管Da1流到直流侧电容C1,最终通过另外两相回到A相电网,具体流通路径如图2(a)所示。电流的流通路径为:从A相电网正极流出,经过电感La,再经过开关管Sa1和开关管Sa2的反向二极管流到直流侧中点N,最终通过另外两相回到A相电网,具体流通路径如图2(b)所示。通态损耗的产生是由电流正向流经IGBT 或者FRD上产生一定的压降,损耗就是正向电流和器件两端正向压降的乘积,开关损耗和反向恢复损耗则是跟开关过程中的直流电压和开关电流有关。

2301_76606324的博客 5737
上一篇: 怎样挑二手本本
下一篇: 计算几何常用算法介绍
lphpc
博客等级 码龄22年 32粉丝 86原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值