0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

常用的数据差错控制技术(1)-重复校验

电子设计 来源: 电子设计 作者: 电子设计 2020-10-30 11:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家讲的是嵌入式里数据差错控制技术 - 重复校验。

嵌入式应用里,除了最核心的数据处理外,我们还会经常和数据传输打交道。数据传输需要硬件传输接口的支持,串行接口由于占用引脚少的优点目前应用比并行接口广泛,常用的串行接口种类非常多,比如 UART,SPI,I2C,USB 等,在使用这些接口传输数据时避不可免会遇到一个问题,如果传输过程中遇到未知硬件干扰发生 bit 错误怎么办?

痞子衡今天给大家讲的就是数据传输过程中用于差错检测的最简单的方法,即重复校验法。

一、重复校验法基本原理

1.1 校验依据

重复校验法的校验依据就是判断重复传输的 q 组 n bits 二进制数据是否一致。

1.2 重复校验位

为了实现重复校验,就是不断重复传输这组 n bits 原始数据 q 次即可,一次校验的 q*n bits 数据块中,仅有 n bits 数据是原始有效数据,校验位就是那些重复的(q-1)*n bits 数据。是不是觉得简单又粗暴?

1.3 校验方法

假设原始数据块是 X[n-1:0]共 n bits,重复次数为 q(q 一般为奇数),按重复传输方式,可分为两个子类:

按 bit 重复:发送数据序列为,q 个 X0(X0X0...),q 个 X1(X1X1...)...,q 个 Xn-1(Xn-1Xn-1...)


按 block 重复:发送数据序列为,第 1 个 X[n-1:0],第 2 个 X[n-1:0]...,第 q 个 X[n-1:0]。

接受端收到数据后,逐次比较 q 个重复位,如完全一致,则认为没有错差;如不一致,则存在错误 bit。如需纠错的话,原理也很简单,判断 q 个重复位里哪种数据位出现的次数多(这里解释了 q 为何应是奇数)则为原始正确数据位。

1.4 C 代码实现

实际中按 block 重复校验法应用比较多,此处示例代码以此为例:

安装包:codeblocks-17.12mingw-setup.exe
集成环境:CodeBlocks 17.12 rev 11256
编译器:GNU GCC 5.1.0
调试器:GNU gdb (GDB) 7.9.1

// repetition_code.c
//////////////////////////////////////////////////////////
#include
#include

/*!
* @brief 处理按 block 重复的数据块
*
* @param src, 待处理的数据块 .
* @param dest, 处理完成的原始数据 .
* @param lenInBytes, 待处理的数据块长度 .
* @param repeatTimes, 数据重复次数(假定为奇数).
* @retval 0, 数据无错误位 .
* @retval 1, 数据有错误位且已纠正 .
*/
uint32_t verify_correct_repetition_block(uint8_t *src,
uint8_t *dest,
uint32_t lenInBytes,
uint32_t repeatTimes)
{
assert(repeatTimes % 2);
assert(!(lenInBytes % repeatTimes));

uint32_t result = 0;
uint32_t blockBytes = lenInBytes / repeatTimes;

// 遍历一个 block 长度里每个 byte
for (uint32_t i = 0; i < blockBytes; i++)
{
// 遍历当前 byte 的每个 bit
uint8_t correctByte = 0;
for (uint32_t j = 0; j < 8; j++)
{
// 遍历当前 byte 的所有重复 byte
uint32_t bit1Count = 0;
for (uint32_t k = 0; k < repeatTimes; k++)
{
// 记录所有重复 byte 中当前 bit 为 1 的个数
uint8_t countByte = *(src + i + k * blockBytes);
bit1Count += (countByte & (0x1u << j)) >> j;
}
// 当 bit1 出现半数则将当前 bit 认定为 1
if (bit1Count > (repeatTimes / 2))
{
correctByte |= 0x1u << j;
}
// 首次发现错误 bit 时,置位 result
if ((!result) && (bit1Count !=0) && bit1Count != repeatTimes)
{
result = 1;
}
}
// 将校验后的 byte 存入 dest
*(dest + i) = correctByte;
}

return result;
}

// main.c
//////////////////////////////////////////////////////////
#include "repetition_code.h"
#include
#include

int main(void)
{
uint8_t src[3][4] = {{0x32, 0x33, 0x04, 0x08},
{0x32, 0x83, 0x04, 0xd8},
{0x31, 0x33, 0x04, 0xe8}};
uint8_t dest[4];
uint32_t result = verify_correct_repetition_block((uint8_t *)src, dest, sizeof(src), sizeof(src) / sizeof(src[0]));

printf("result = %d/n", result);
for (uint32_t i = 0; i < sizeof(dest); i++)
{
printf("dest[%d] = 0x%x/n", i, dest[i]);
}
return 0;
}

1.5 行业应用

实际上本文所讲的单纯的重复校验法行业因为效率的原因,行业里较少应用,其改进版的实现 RA Codes 应用在了 FlexRay 协议里。

二、重复校验法失效分析

重复校验实现非常简单,具有比较理想的检错能力,但效率太低,并未得到广泛使用。即便牺牲了效率,但重复校验法也存在如下 2 个缺陷,导致其检错纠错并不可靠:

当重复 bit 全部发生错误时,会被误认为没有错误 bit 发生。


当错误 bit 出现概率大于原始 bit 时,在纠错时会认定错误 bit 是原始 bit。

有没有其他比重复校验法更高效的检错方法?痞子衡在下篇会继续聊。

至此,嵌入式里数据差错控制技术之重复校验痞子衡便介绍完毕了,掌声在哪里~~~

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制技术
    +关注

    关注

    3

    文章

    359

    浏览量

    34066
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瀚海微SD NAND/TF卡数据损坏与校验错误(含CRC错误、数据比对失败)问题解析

    数据损坏与校验错误是瀚海微SD NAND/TF卡在数据存储与传输过程中的关键故障,除常见的CRC错误外,数据比对失败(读取数据与写入
    的头像 发表于 11-30 15:15 357次阅读

    硬件循环冗余校验(CRC)模块介绍

    CRC是一种错误检测码,用于检测数据传输或存储中的意外更改。它通过对数据应用特定的算法生成一个固定长度的校验值。这个校验值附加在数据后面,接
    发表于 11-21 07:39

    CS校验原理与应用

    原理: CS校验数据块中所有字节(或字)进行累加求和,最终结果取模(通常是模 256 或 65536)后取补码(或直接截断)作为校验值。 例如:8位校验和 = (所有字节之和) mo
    发表于 11-19 07:51

    CRC校验的原理和应用

    原理: CRC校验数据视为一个二进制多项式,用一个预先定义好的生成多项式(Generator Polynomial) 进行模2除法,得到的余数作为CRC校验码。 例如:数据多项式 ÷
    发表于 11-14 06:48

    CRC校验的本质和物理意义

    工业控制系统中,Modbus RTU协议的CRC校验如同通信网络的\"免疫系统\",某石化厂DCS系统曾因CRC计算错误导致0.3%的数据包丢失,引发连锁控制故障。 一、CRC
    发表于 11-13 07:58

    如何验证电能质量在线监测装置数据校验系统的准确性?

    验证电能质量在线监测装置 数据校验系统的准确性 ,核心是通过 “标准基准对比、模拟真实工况、量化指标评估”,确保校验系统能精准识别监测装置数据的 “正确性 / 偏差性”,且结果符合国际
    的头像 发表于 09-25 17:42 516次阅读

    进行数据校验时如何保证场景覆盖的全面性?

    数据校验中保证场景覆盖的全面性,核心是 从 “数据属性 - 业务逻辑 - 异常边界 - 环境交互” 多维度拆解场景 ,通过系统化梳理、优先级排序和动态迭代,避免因场景遗漏导致校验漏洞
    的头像 发表于 09-25 17:42 505次阅读

    怎样选择适合的数据校验系统时间同步硬件?

    在电能质量在线监测装置的数据校验系统中, 时间同步硬件的选择需紧密匹配 “数据校验准确性” 核心需求 (如多监测点数据时间戳一致性、
    的头像 发表于 09-19 11:46 338次阅读
    怎样选择适合的<b class='flag-5'>数据</b><b class='flag-5'>校验</b>系统时间同步硬件?

    如何保证数据校验系统的时间同步以提高准确性?

    在电能质量监测的数据校验系统中, 时间同步的准确性直接决定了多监测点数据的时空一致性、暂态事件的时序匹配度,以及校验结果的可信度 。要保证时间同步以提升
    的头像 发表于 09-19 11:28 325次阅读

    电能质量监测中,有哪些方法可以提高数据校验系统的准确性?

    在电能质量监测中,数据校验系统的准确性是保障监测数据可信度的核心,需从 “标准源精度、校准流程、硬件适配、算法优化、时间同步、运维管理” 等多维度构建提升方案,针对性解决 “信号失真、参数偏差、环境
    的头像 发表于 09-19 10:03 412次阅读

    如何制定电能质量在线监测装置的数据校验标准?

    制定电能质量在线监测装置(以下简称 “监测装置”)的数据校验标准,需以 确保数据准确性、可靠性、一致性 为核心目标,结合国际 / 国内通用规范、实际应用场景(如工业、民用、电网侧)及监测装置的
    的头像 发表于 09-18 11:40 516次阅读
    如何制定电能质量在线监测装置的<b class='flag-5'>数据</b><b class='flag-5'>校验</b>标准?

    如何控制和减少电磁干扰对电能质量在线监测装置校验准确性的影响?

    控制和减少电磁干扰(EMI)对电能质量在线监测装置校验准确性的影响,需从 干扰源头阻断、传播路径切断、装置抗扰能力提升、校验环境管控 四个核心维度入手,结合硬件设计、安装部署、校验
    的头像 发表于 09-18 11:23 415次阅读

    如何确保电能质量在线监测装置的数据校验的准确性?

    确保电能质量在线监测装置(以下简称 “监测装置”)数据校验的准确性,需围绕 “ 标准溯源、流程规范、环境控制数据审核、全周期追溯 ” 五大核心环节,建立全链条管控机制,覆盖
    的头像 发表于 09-18 11:05 382次阅读
    如何确保电能质量在线监测装置的<b class='flag-5'>数据</b><b class='flag-5'>校验</b>的准确性?

    KT6368A蓝牙芯片应该自带数据校验机制吗?

    KT6368A蓝牙芯片应该自带数据校验机制吗?
    的头像 发表于 04-19 16:34 788次阅读
    KT6368A蓝牙芯片应该自带<b class='flag-5'>数据</b><b class='flag-5'>校验</b>机制吗?

    基于Verilog语言实现CRC校验

    CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种
    的头像 发表于 03-24 10:36 2164次阅读
    基于Verilog语言实现CRC<b class='flag-5'>校验</b>