奇偶校验需要一位校验位,即使用串口通信的方式2或方式3(8位数据位+1位校验位)。
奇校验(odd parity):让传输的数据(包含校验位)中1的个数为奇数。
即:如果传输字节中1的个数是偶数,则校验位为“1”,奇数相反。
以发送字符:10101010为例

偶校验(even parity):让传输的数据(包含校验位)中1的个数为偶数。
即:如果传输字节中1的个数是偶数,则校验位为“0”,奇数相反。
还是以发送字符:10101010为例

数据和校验位发送给接受方后,接收方再次对数据中1的个数进行计算,如果为奇数则校验通过,表示此次传输过程未发生错误。如果不是奇数,则表示有错误发生,此时接收方可以向发送方发送请求,要求重新发送一遍数据。
优缺点:
- 奇偶校验的检错率只有50%,因为只有奇数个数据位发生变化能检测到,如果偶数个数据位发生变化则无能为力了╮(╯﹏╰)╭
- 奇偶校验每传输一个字节都需要加一位校验位,对传输效率影响很大。
- 奇偶校验只能发现错误,但不能纠正错误,也就是说它只能告诉你出错了,但不能告诉你怎么出错了,一旦发现错误,只好重发。
- 虽然奇偶校验有很多缺点,但因为其使用起来十分简单,故目前仍被广泛使用。
应用:
如何用编程确定一个字节中“1”个数的奇偶性?我们可以利用二进制数相加的特点:
0+0=0、1+0=1、1+1=0
可以看出,如果我们将一个字节的所有位相加
- 有奇数个“1”的字节的和为1
- 有偶数个“1”的字节的和为0
由此即可通过编程完成判断。实际应用中,实现方法很多,但这是相对简单的一种,这里不再赘述。
代码实现部分如下:
#include
#include
unsigned char add(char data)//奇校验
{
int i, cnt = 0;
for (i = 0; i < 7; i++)//一个char型有7位
{
int temp = ((data >> i) & 1);//data >> i是向右移i个位置得到的值,((data >> i) & 1)是与1不同的个数
cnt += temp;//cnt记录二进制下data中1的个数
}
unsigned char ans = data << 1;//左移1位
if (cnt % 2 == 0)//当cnt能够被2整除,即cnt是偶数,即1的个数是偶数
{
ans += 1;//在最右边加1
}
else//当cnt不能够被2整除,即cnt是奇数,即1的个数是奇数
{
ans += 0;//在最右边加0
}
return ans;
}
unsigned char add_2(char data)//偶校验
{
int i, cnt = 0;
for (i = 0; i < 7; i++)//一个char型有7位
{
int temp = ((data >> i) & 1);//data >> i是向右移i个位置得到的值,((data >> i) & 1)是与1不同的个数
cnt += temp;//cnt记录二进制下data中1的个数
}
unsigned char ans = data << 1;//左移1位
if (cnt % 2 == 0)//当cnt能够被2整除,即cnt是偶数,即1的个数是偶数
{
ans += 0;//在最右边加0
}
else//当cnt不能够被2整除,即cnt是奇数,即1的个数是奇数
{
ans += 1;//在最右边加1
}
return ans;
}
int main()
{
char a;
unsigned char b;
scanf("%c", &a);
b = add(a);
printf("2进制结果表示为:");//输出b的2进制表示
for (int i = 7; i >= 0; i--) {
if (((b>>i) & 1) == 1)
printf("1");
else
printf("0");
} putchar(10);
return 0;
}
审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
嵌入式C
+关注
关注
0文章
6浏览量
7192 -
奇偶校验
+关注
关注
0文章
16浏览量
8444
发布评论请先 登录
相关推荐
热点推荐
SN74BCT29854:8位到9位奇偶校验总线收发器的技术剖析
SN74BCT29854:8位到9位奇偶校验总线收发器的技术剖析 在电子设计领域,数据传输的准确性和可靠性至关重要。今天,我们将深入探讨德州仪器(TI)的SN74BCT29854 8位到9位奇偶校验
解析IDT74SSTUBF32865A:28位1:2带奇偶校验的寄存器缓冲器
解析IDT74SSTUBF32865A:28位1:2带奇偶校验的寄存器缓冲器 在电子设计领域,对于DDR2内存模块等应用来说,一款性能优良的寄存器缓冲器至关重要。今天我们就来深入剖析Renesas
IDT74SSTU32865:28位1:2带奇偶校验寄存器缓冲器的技术剖析
IDT74SSTU32865:28位1:2带奇偶校验寄存器缓冲器的技术剖析 在DDR2 DIMM设计领域,IDT74SSTU32865这一28位1:2带奇偶校验的寄存器缓冲器扮演着重要角色。下面我们
74ABT899:9位可锁存收发器与奇偶校验器的技术剖析
74ABT899:9位可锁存收发器与奇偶校验器的技术剖析 在电子设计领域,一款性能优良的收发器对于数据传输和校验至关重要。今天,我们就来深入探讨Fairchild Semiconductor推出
剖析IDT74SSTUBF32865A:28位1:2带奇偶校验的寄存器缓冲器
剖析IDT74SSTUBF32865A:28位1:2带奇偶校验的寄存器缓冲器 在DDR2内存模块的设计中,一款优秀的寄存器缓冲器至关重要。今天我们就来深入了解Renesas
CW32L083RBT6在手机APP无线温控器应用优势
等级
●最大 256K 字节 FLASH,数据保持 25 年 @85℃
●最大 24K 字节 RAM,支持奇偶校验
●复位和电源管理
--低功耗模式(Sleep,DeepSleep)
--上电
发表于 01-14 08:04
CW32F030 RAM存储器的介绍
时钟频率进行访问
•支持奇偶校验功能
3 RAM 存储器操作
用户可执行的 RAM 存储器操作包括:读操作、写操作。
对 RAM 的读写操作支持 8bit、16bit 和 32bit 三种
发表于 01-12 06:33
CW32F030 UART的主要特性
半双工
支持硬件流控 RTS、CTS
支持直接内存访问 (DMA)
支持多机通信,自动地址识别
6 个带中断标志的中断源
错误检测:奇偶校验错误、帧结构错误
低功耗模式下收发数据,中断唤醒 MCU
发表于 12-11 08:07
UART的缺点介绍
: UART 的错误检测仅限于奇偶校验,奇偶校验会向数据帧添加一个额外的位以用于错误检测。然而,奇偶校验只能检测奇数或偶数个位错误,并且不如循环冗余校验 (CRC) 等更高级的错误检查
发表于 11-27 06:36
CS校验原理与应用
接收方重新计算校验和,与接收到的校验值比较。
特点:
简单快速:计算量小,硬件/软件实现容易。
检测能力有限:
能检测奇数个比特错误。
能检测部分突发错误(但不如CRC)。
无法检测某些常见错误(如
发表于 11-19 07:51
CW32F030K8T7的核心性能
64KB FLASH,数据保持时间长达 25 年(@85℃)。
数据存储器:最大 8KB RAM,支持奇偶校验,确保数据可靠性。
OTP 存储器:128 字节,用于存储唯一标识或加密密钥。[/td][/tr]
发表于 11-18 08:03
电能质量在线监测装置自诊断功能的软件校验具体是如何实现的?
)和通信异常,具体实现可分为三大核心模块,每个模块都有明确的校验逻辑和落地方法: 一、数据合理性校验:基于物理规律的 “数据质检” 软件通过预设电网运行的 “合理边界”,校验采样数据的
SEM IP在MPSoC器件上的使用指南
SEM(Soft Error Mitigation)技术通过目标式ECC奇偶校验位注入实现可观测的软错误模拟。该机制在配置存储器帧(CRAM Frame)内精确选择校验位进行可控翻转,确保注入错误
【RA-Eco-RA6M4开发板评测】+初识篇
RA-Eco-RA6M4开发板是一款基于 Arm® Cortex®-M33 内核的开发工具,且具有1MB 闪存、192kB支持奇偶校验 SRAM 以及64kb ECC SRAM。
该开发板的外观如图
发表于 07-16 19:06
奇偶校验的优缺点及奇偶校验代码实现
评论