百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

常用的数据差错控制技术(2)-奇偶校验

liuian 2024-12-02 22:28 40 浏览

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

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

一、奇偶校验法基本原理

1.1 校验依据

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

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

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

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

1.2 奇偶校验位

为了实现奇偶校验,通常会在传输的这组二进制数据中插入一个额外的奇偶校验位(bit),用它来确保发送出去的这组二进制数据中“1”的个数为奇数或偶数。

划重点,奇偶校验位并不是用来标记原始传输数据中 1 的个数是奇数还是偶数,而是用来确保原始数据加上奇偶校验位后的合成数据中 1 的个数是奇数或者偶数。

1.3 校验方法

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

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

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

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

所以加上垂直偶校验位后应传输的数据是: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

1.5 行业应用

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

二、奇偶校验法失效分析

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

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

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

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

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

相关推荐

eino v0.4.5版本深度解析:接口类型处理优化与错误机制全面升级

近日,eino框架发布了v0.4.5版本,该版本在错误处理、类型安全、流处理机制以及代理配置注释等方面进行了多项优化与修复。本次更新共包含6个提交,涉及10个文件的修改,由2位贡献者共同完成。本文将详...

SpringBoot异常处理_springboot异常注解

在SpringBoot中,异常处理是构建健壮、可维护Web应用的关键部分。良好的异常处理机制可以统一返回格式、提升用户体验、便于调试和监控。以下是SpringBoot中处理异常的完整指...

Jenkins运维之路(Jenkins流水线改造Day02-1-容器项目)

这回对线上容器服务器的流水线进行了一定的改造来满足目前线上的需求,还是会将所有的自动化脚本都放置到代码库中统一管理,我感觉一章不一定写的完,所以先给标题加了个-1,话不多说开干1.本次流水线的流程设计...

告别宕机!零基础搭建服务器监控告警系统!小白也能学会!

前言本文将带你从零开始,一步步搭建一个完整的服务器指标监控与邮件告警系统,使用的技术栈均为业界主流、稳定可靠的开源工具:Prometheus:云原生时代的监控王者,擅长指标采集与告警规则定义Node_...

httprunner实战接口测试笔记,拿走不谢

每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试码同学抖音号:小码哥聊软件测试01开始安装跟创建项目pipinstallhttprunne...

基于JMeter的性能压测平台实现_jmeter压测方案

这篇文章已经是两年前写的,短短两年时间,JMeter开源应用技术的发展已经是翻天覆地,最初由github开源项目zyanycall/stressTestPlatform形成的这款测试工具也开始慢...

12K+ Star!新一代的开源持续测试工具!

大家好,我是Java陈序员。在企业软件研发的持续交付流程中,测试环节往往是影响效率的关键瓶颈,用例管理混乱、接口调试复杂、团队协作不畅、与DevOps流程脱节等问题都能影响软件交付。今天,给大家...

Spring Boot3 中分库分表之后如何合并查询

在当今互联网应用飞速发展的时代,数据量呈爆发式增长。对于互联网软件开发人员而言,如何高效管理和查询海量数据成为了一项关键挑战。分库分表技术应运而生,它能有效缓解单库单表数据量过大带来的性能瓶颈。而在...

离线在docker镜像方式部署ragflow0.17.2

经常项目上会出现不能连外网的情况,要怎么使用ragflow镜像部署呢,这里提供详细的步骤。1、下载基础镜像根据docker-compose-base.yml及docker-compose.yml中的i...

看,教你手写一个最简单的SpringBoot Starter

何为Starter?想必大家都使用过SpringBoot,在SpringBoot项目中,使用最多的无非就是各种各样的Starter了。那何为Starter呢?你可以理解为一个可拔插式...

《群星stellaris》军事基地跳出怎么办?解决方法一览

《群星stellaris》军事基地跳出情况有些小伙伴出现过这种情况,究竟该怎么解决呢?玩家“gmjdadk”分享的自己的解决方法,看看能不能解决。我用英文原版、德语、法语和俄语四个版本对比了一下,结果...

数据开发工具dbt手拉手教程-03.定义数据源模型

本章节介绍在dbt项目中,如何定义数据源模型。定义并引入数据源通过Extract和Load方式加载到仓库中的数据,可以使用dbt中的sources组件进行定义和描述。通过在dbt中将这些数据集(表)声...

docker compose 常用命令手册_docker-compose init

以下是DockerCompose常用命令手册,按生命周期管理、服务运维、构建配置、扩缩容、调试工具分类,附带参数解析、示例和关键说明,覆盖多容器编排核心场景:一、生命周期管理(核心命令...

RagFlow与DeepSeek R1本地知识库搭建详细步骤及代码实现

一、环境准备硬件要求独立显卡(建议NVIDIAGPU,8GB显存以上)内存16GB以上,推荐32GB(处理大规模文档时更高效)SSD硬盘(加速文档解析与检索)软件安装bash#必装组件Docker...

Docker Compose 配置更新指南_docker-compose配置

高效管理容器配置变更的最佳实践方法重启范围保留数据卷适用场景docker-composeup-d变更的服务常规配置更新--force-recreate指定/所有服务强制重建down→up流程...