当前位置: 首页 > news >正文

RTCM数据解码

RTCM

RTCM数据协议介绍

1. 一帧数据组成

在这里插入图片描述

2.数据接收

/*(1) synchronize frame */
if (rtcm.nbyte == 0){if (data != RTCM3PREAMB)//RTCM3PREAMB:同步码return 0;rtcm.buff[rtcm.nbyte++] = data;return 0;}
//(2)添加一Byte数据rtcm.buff[rtcm.nbyte++] = data;// (3)当Byte数量为3时,读取数据长度(一帧RTCM数据除去CRC的数据的Byte数)
if (rtcm.nbyte == 3){//getbitu(rtcm.buff, 14, 10)得到rtcm.buff第14个字节之后的10个字节信息。
// ,+3表示前三个byte(同步码、保留位、数据长度)rtcm.len = (int)rtcmcmn.getbitu(rtcm.buff, 14, 10) + 3; /* length without parity */}//(4)读取完成nbyte数重置if (rtcm.nbyte < 3 || rtcm.nbyte < rtcm.len + 3) //+3表示比数据长度多接收3个Byte,其为为校验位return 0;rtcm.nbyte = 0;

实时数据传输进来经过(1)(2)(3)(4)四个步骤存储到buff中。

注:byte[] buff。每次接收1Byte(字节)数据对应8bit(位)

  • 位(bit):比特,指二进制中的一位,是二进制的最小信息单位。 bit也被称作小b,用b表示。(所以byte是大B),一个二进制数据0或1,是1bit。
  • 字节byte:1byte有8位 最大值为255 最小值是0 2^8-1=255
/*
目的获取buff(byte数组)从pos位起始后len位表示的信息。 
*/public static uint getbitu(byte[] buff, int pos, int len){uint bits = 0;int i;try{for (i = pos; i < pos + len; i++){//[i / 8] 取整,i % 8取余bits = (bits << 1) + ((uint)(buff[i / 8] >> (7 - i % 8)) & 1u);}}
return bits;
}

注:[i / 8]:当前位i所在的buff索引,buff[i / 8] :包含当前位信息的字节(Byte),(buff[i / 8] >> (7 - i % 8):截取字节中i位的信息。(bits << 1) :将上一次循环计算得到的高位信息左移来保留高位信息。

3. CRC校验

再通过(4)判定之后,接受完一帧数据通过CRC校验保证数据的完整性。

  //(5)校验位,校验数据是否完整
if (rtcmcmn.crc24q(rtcm.buff, rtcm.len) != rtcmcmn.getbitu(rtcm.buff, rtcm.len * 8, 24)){//trace(2, "rtcm3 parity error: len=%d\n", rtcm.len);return 0;}

CRC检校原理
模2除法
RTKLIB中CRC-24Q检校代码:

  crc = ((crc << 8) & 0xFFFFFF) ^ tbl_CRC24Q[(crc >> 16) ^ buff[i]];
  • crc << 8表示将32位的crc左移8位,低位补0。(crc << 8) & 0xFFFFFF表示只取移位后从低位开始的24位,即从左到右24位。crc >> 16表示将crc右移16位。
  • (crc >> 16) ^ buff[i] 表示对移位后的数据与buff[i]中的八位进行按位异或运算得到n
  • 最后根据计算结果n选取tbl_CRC24Q数组中的第n个数在与(crc << 8) & 0xFFFFFF进行按位异或运算。
    注:tbl_CRC24Q数组为八位二进制数组(即0-255的二进制表示),表示原始数据除以相应校验多项式后的余数表。

注:

<<:左移运算,a<<m,将a按二进制位向左移动m位,高位移除后,低位补0>>:右移运算,a>>m,将a按二进制位向右移动m位,低位移除后,高位补0^  :按位异或运算,二进制逐位非或,从最小(及最右)的位开始,对操作位数逐位操作,相同           为0,不同为1。例如:X:0000 1011 1111   Y:1111 0101 1111     X^Y:1111 1110 00000xFFFFFF0x表示16进制,FFFFFFFF 一个F代表4位的1111

crc表介绍

常用数据类型

相关文章:

  • C# Winform编程(9)网络编程
  • 基于图像识别的自动驾驶汽车障碍物检测与避障算法研究
  • 如何批量给视频添加logo水印?
  • Cookie技术
  • 父子项目打包发布至私仓库
  • vue3 + Element-plus + Echarts 5.2 切换不更新、导出PDF不显示 解决方案
  • Linux系统下DHCP服务安装部署和使用实例详解(蜜罐)
  • 031-从零搭建微服务-监控中心(一)
  • SSH 22
  • 酷开科技依托酷开系统推动家庭智能化加速发展
  • 【开源】基于SpringBoot的城市桥梁道路管理系统的设计和实现
  • vue中如何给后端过来的数组中每一个对象加一个新的属性和新的对象(不影响后端的原始数据)
  • (四)库存超卖案例实战——优化redis分布式锁
  • 重入漏洞EtherStore
  • 21.9 Python 使用Selenium库
  • 【译】JS基础算法脚本:字符串结尾
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Elasticsearch 参考指南(升级前重新索引)
  • exports和module.exports
  • Fabric架构演变之路
  • flutter的key在widget list的作用以及必要性
  • Git学习与使用心得(1)—— 初始化
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Laravel 中的一个后期静态绑定
  • Promise面试题,控制异步流程
  • windows下mongoDB的环境配置
  • 关于 Cirru Editor 存储格式
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于web的全景—— Pannellum小试
  • 入门到放弃node系列之Hello Word篇
  • 小试R空间处理新库sf
  • 怎么把视频里的音乐提取出来
  • 阿里云重庆大学大数据训练营落地分享
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​configparser --- 配置文件解析器​
  • ​如何在iOS手机上查看应用日志
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (分布式缓存)Redis分片集群
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (九)信息融合方式简介
  • (一)kafka实战——kafka源码编译启动
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)fock函数详解
  • ./configure,make,make install的作用(转)
  • ./configure、make、make install 命令
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET 事件模型教程(二)
  • .NET企业级应用架构设计系列之技术选型
  • /var/log/cvslog 太大