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

  在嵌入式应用里,除了最核心的数据处理外,我们还会经常和数据传输打交道。数据传输需要硬件传输接口的支持,串行接口由于占用引脚少的优点目前应用比并行接口广泛,常用的串行接口种类非常多,比如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 <stdint.h>
#include <assert.h> /*!
* @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 <stdio.h>
#include <stdlib.h> 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。

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

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

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:常用的数据差错控制技术(1)- 重复校验(Repetition Code)的更多相关文章

  1. 痞子衡嵌入式:常用的数据差错控制技术(2)- 奇偶校验(Parity Check)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式里数据差错控制技术-奇偶校验. 在系列第一篇文章里,痞子衡给大家介绍了最简单的校验法-重复校验,该校验法实现简单,检错纠错能力都还不 ...

  2. 痞子衡嵌入式:常用的数据差错控制技术(3)- 和校验(Checksum)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式里数据差错控制技术-和校验. 在系列前一篇文章里,痞子衡给大家介绍了比较简单的校验法-奇偶校验,该校验法主要是针对byte传输校验而 ...

  3. 痞子衡嵌入式:i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad. 最近碰到一个客户,他们在 i.MX ...

  4. 痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术 ...

  5. 痞子衡嵌入式:极易上手的可视化wxPython GUI构建工具(wxFormBuilder)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是wxPython GUI构建工具wxFormBuilder. 一.手工代码布局GUI界面的烦恼 如果你曾经设计过上位机软件GUI界面,初 ...

  6. 痞子衡嵌入式:恩智浦MCU安全加密启动一站式工具NXP-MCUBootUtility用户指南

    NXP MCU Boot Utility English | 中文 1 软件概览 1.1 介绍 NXP-MCUBootUtility是一个专为NXP MCU安全加密启动而设计的工具,其特性与NXP M ...

  7. 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...

  8. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU特性介绍(2)- RT1052DVL6性能实测

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的性能. 在前面的文章 i.MXRT微控制器概览 里,痞子衡给大家简介过恩智浦半导体在2017年推出的新 ...

  9. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(8)- 从Raw NAND启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Raw NAND启动. 前面铺垫了七篇启动系列文章,终于该讲具体Boot Device了,我们知道i. ...

随机推荐

  1. idea在springboot项目中没有【新建JSP选项】的解决方法

    https://blog.csdn.net/qq_26525215/article/details/53726690 转载于CSDN

  2. 201771010126 王燕《面向对象程序设计(Java)》第十二周学习总结

    实验十二  图形程序设计 实验时间 2018-11-14 1.实验目的与要求 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: 创建空框架 . 在Java中,常采用框架(Frame) ...

  3. 2.9 linux学习(1)

    2019-2-9 16:07:44 学一下Linux,多学一点东西 新认识个老师,超哥 很牛逼感觉! https://www.cnblogs.com/pyyu/p/9276851.html 这是入门参 ...

  4. [LeetCode] Hand of Straights 一手顺子牌

    Alice has a hand of cards, given as an array of integers. Now she wants to rearrange the cards into ...

  5. Centos 搭建邮箱系统

    总结 我实操的过程,2个邮箱都没有界面,都只是邮件系统.可能还需要再部署其他东西,暂止. sendmail 比较简单,主要是发邮件,使用 stmp.还需要解决收邮件的问题和管理界面的问题. postf ...

  6. web测试实践——day01

    一.任务进展情况 主要是找寻网站的bug,分析bug的严重程度.同时找了本专业的同学进行博客园系统的使用. 二.存在的问题 由于上线的网站做的比较完善,导致找寻bug比较困难. 三.解决方法 对此我们 ...

  7. HBuilder git使用-分工合作

    1.初始项目的创建 创建好项目,在项目名上右键,Team->共享 完成后,就实现了本地仓库的建立,另外你要注意现在创建的项目所有文件变成了红色,Git Repositories视图列出了相应的本 ...

  8. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)

    背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮币”.为了增加趣味性,帮帮币“掉落”之后所有用户都可以“捡取”,谁先捡到 ...

  9. [Swift]LeetCode231. 2的幂 | Power of Two

    Given an integer, write a function to determine if it is a power of two. Credits:Special thanks to @ ...

  10. [Swift]LeetCode376. 摆动序列 | Wiggle Subsequence

    A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...