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

  在系列第一篇文章里,痞子衡给大家介绍了最简单的校验法-重复校验,该校验法实现简单,检错纠错能力都还不错,但传输效率实在是不高,在效率至上的大背景下,这种方法是不能容忍的。今天痞子衡继续给大家介绍另一种也非常简单但效率较高的校验法-即奇偶校验法。

一、奇偶校验法基本原理

1.1 校验依据

  奇偶校验法的校验依据就是判断一次传输的一组二进制数据中bit "1"的奇偶性(奇数个还是偶数个)在传输前后是否一致,所以其实奇偶检验法有两个子类:

  • 奇校验:如果以二进制数据中1的个数是奇数为依据,则是奇校验

  • 偶校验:如果以二进制数据中1的个数是偶数为依据,则是偶校验

  一般在同步传输方式中常采用奇校验,而在异步传输方式中常采用偶校验。

1.2 奇偶校验位

  为了实现奇偶校验,通常会在传输的这组二进制数据中插入一个额外的奇偶校验位(bit),用它来确保发送出去的这组二进制数据中“1”的个数为奇数或偶数。
  划重点,奇偶校验位并不是用来标记原始传输数据中1的个数是奇数还是偶数,而是用来确保原始数据加上奇偶校验位后的合成数据中1的个数是奇数或者偶数。

1.3 校验方法

  常用的奇偶校验共有三种:水平奇偶校验,垂直奇偶校验校验和水平垂直奇偶校验。以对32位数据:10100101 10111001 10000100 00011010进行校验为例讲解:

  • 水平奇偶校验:对每一种数据的编码添加校验位,使信息位与校验位处于同一行。

原始数据 水平奇校验位 水平偶校验位
10100101 1 0
10111001 0 1
10000100 1 0
00011010 0 1

  所以加上水平偶校验位后应传输的数据是:101001010 101110011 100001000 000110101

  • 垂直奇偶校验:将数据分为若干组,一组一行,再加上一行校验位,针对每一列采样奇校验或偶校验。

编码分类 垂直奇校验 垂直偶校验
原始数据 10100101 10100101
10111001 10111001
10000100 10000100
00011010 00011010
校验位 01111101 10000010

  所以加上垂直偶校验位后应传输的数据是:10100101 10111001 10000100 0001101010000010

  • 水平垂直奇偶校验:也叫Hamming Code,其是在水平和垂直方向上进行双校验,其不仅可以检测2bit错误的具体位置,还可纠正1bit错误,常用于NAND Flash里。这部分不属于本文要讨论的内容,痞子衡后续会专门介绍Hamming Code。

1.4 C代码实现

  实际中水平校验法应用比较多,此处示例代码以水平奇校验为例:

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

// parity_check.c//#include #include 

/*! * @brief 判断当前byte的极性是否为奇 * * @param byte, 待计算奇偶性的数据. * @retval ture, byte极性(含1的个数)为奇数. * @retval false, byte极性(含1的个数)为偶数. */bool is_byte_odd_parity(uint8_t byte){bool parity = false;// 普通算法-byte逐位异或(需循环8次)/*    for (uint8_t i = 0; i < 8; i++)    {        parity ^= byte & 0x01u;        byte >>= 1;    }    */// 效率较高算法-计数byte中1的个数(需循环n次,n为byte中1的个数)while (byte)    {        parity = !parity;        byte &= byte - 1;    }return parity;}

/*! * @brief 获取给定data的水平奇校验位 * * @param src, 待计算奇偶性的数据块. * @param lenInBytes, 待计算奇偶性的数据块长度. * @retval 0, data极性(含1的个数)为奇数. * @retval 1, data极性(含1的个数)为偶数. */uint32_t get_data_parity(uint8_t *src,uint32_t lenInBytes){uint32_t result = 0;// 水平校验法// isDataOddParity用于判断所有data bits的行极性是否为奇bool isDataOddParity = false;while (lenInBytes--)    {        isDataOddParity ^= is_byte_odd_parity(*src++);    }// result为所有data bits的奇校验位    result = !isDataOddParity;

return result;}

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

int main(void){uint8_t data[4] = {0x31, 0x33, 0x04, 0x08};uint32_t parity = get_data_parity(data, sizeof(data));

printf("parity = %d\n", parity);return 0;}

1.5 行业应用

  奇偶检验比较典型的应用是在串口UART上,玩过UART的朋友肯定了解串口奇偶检验位的作用,包括下位机MCU UART驱动的编写,上位机串口调试助手的设置都需要注意奇偶校验位。下图是UART传输时序图,奇偶校验位是可选位,仅当使能时才会生效。不过作为嵌入式开发者,倒不必关注奇偶校验的具体实现,因为MCU的UART模块已经在硬件上支持了奇偶检验,我们只需要操作UART对应寄存器的控制位去使能奇偶检验功能即可。

二、奇偶校验法失效分析

  在现实数据传输中,偶尔1位出错的机会最多,2位及以上发生错误的概率比较低,且由于奇偶校验实现简单,具有相对理想的检错能力,因此得到广泛使用。但奇偶校验法有如下2个明显的缺陷:

  • 奇数位误码能检出,偶数位误码不能检出

  • 不能纠错,在发现错误后,只能要求重发。

  前面讲的两种校验法实际上更多是针对byte传输校验,而在实际应用中我们校验的对象往往是数据包packet,有没有其他比奇偶校验法更好且针对packet的检错方法呢?痞子衡在下篇会继续聊。

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

c++判断奇偶_常用的数据差错控制技术(2) 奇偶校验相关推荐

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

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

  2. c语言中0x1u是多少,常用的数据差错控制技术(1) - 重复校验-嵌入式系统-与非网...

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式里数据差错控制技术 - 重复校验. 在嵌入式应用里,除了最核心的数据处理外,我们还会经常和数据传输打交道.数据传输需要硬件传输接口的 ...

  3. c++判断奇偶_第十一届(今年)蓝桥杯省模拟赛 试题+源码 C/C++详解

    后台回复开发工具,免费获取C语言常用编译器 本文章来源:CSDN|亓官劼 本文是第十一届蓝桥杯省模拟赛的试题和部分题解,博主参加的是4.13日的下午场,也就是本次模拟赛的第一天了吧,不知道有没有上午场 ...

  4. python isodd()判断奇偶_位运算(1的个数;2.判断奇偶)

    1. 1的个数 int NumberOf1(intn){int count = 0;while(n) {++count; n=(n-1)&n; } } 同样一个问题,位运算可以提高程序的运行效 ...

  5. c++判断奇偶_高中数学奇偶性说课稿范文

    高中数学奇偶性说课稿范文 作为一名辛苦耕耘的教育工作者,常常要根据教学需要编写说课稿,借助说课稿可以更好地组织教学活动.写说课稿需要注意哪些格式呢?以下是小编收集整理的高中数学奇偶性说课稿范文,仅供参 ...

  6. 用python编写程序判断奇偶_如何用python判断奇偶数

    问题分析:用Python编写一个程序,判断输入的数字是奇数还是偶数,并相应的输出信息,要判断一个数为奇数还是偶数,依据的是它被2除后的余数.因此可以用"%"运算符来计算并判断. 代 ...

  7. 位运算判断奇偶数_位运算符判断奇偶

    之前在学习Java时其实已经踩过一次坑,这次又忘了.再次记录一下这个小问题 我们在判断奇偶时,除了最常用的%2,还可以用位运算符&去判断,但是有时会忘了加上括号,导致结果出错. 如图:本意想让 ...

  8. 位运算判断奇偶数_位运算判断奇偶数

    第一条:利用位运算判断一个整数是奇数还是偶数. 经常用到一个for循环,当索引i是奇数时执行语句A,偶数时执行语句B.判断i是奇数还是偶数,可用如下方法: if(i &1){ //i是奇数情况 ...

  9. 位运算判断奇偶数_基础拾遗:除了amp;和amp;amp;的区别,你还要知道位运算的这5个运算符...

    01 前言 那年刚找工作那会,就碰到过这么一个简单的题目1.都是作为逻辑与的运算符.2.&&具有短路功能,计算出前者false,就不需计算后者的true or false.后来在微信群 ...

最新文章

  1. shiroConfig配置中要注意的事项
  2. 404.2错误解决方案
  3. mysql 经典问题_mysql经典排名问题
  4. linux每日命令(5):mkdir命令
  5. vue框架项目部署到服务器_在浏览器中在线尝试无服务器框架项目!
  6. python 读中文乱码_python字符乱码的解决小结
  7. python都有哪些包装_Python基础:21包装
  8. python 实现SOM: 函数更新
  9. Win 7 各版本的含义
  10. ln火线零线_插座怎么接LN线
  11. Rayman的绝顶之路——Leetcode每日一题打卡5
  12. windows系统ftp服务器,Windows下使用的FTP服务器软件
  13. muduo base库学习笔记 10——日志类封装详解
  14. Spring Boot 快速入门(二)主配置文件、yml配置文件语法
  15. UITableViewCell设置行距
  16. 投资百万运营站点 为何仅仅坚持了一年?
  17. 操作系统-进程调度实验报告
  18. 游戏服务器生成全局唯一ID的几种方法
  19. sina\tent微博分享
  20. linux配置iscsi无账号密码,rhel7.0 轻松解决ISCSI的配置

热门文章

  1. mysql/mariadb centos7 修改root用户密码及配置参数
  2. 文本框可编辑查看页面
  3. RuntimeError: Expected object of backend CUDA but got backend CPU for argument
  4. 一起读Bert文本分类代码 (pytorch篇 五)
  5. 函数的渐近的界阶的比较
  6. Intel发布FPGA
  7. Paddle预训练模型应用工具PaddleHub
  8. MinkowskiEngine基准测试
  9. NVIDIA TensorRT高性能深度学习推理
  10. 嵌入式开发在过去20年中是如何演变的