奇偶校验需要一位校验位,即使用串口通信的方式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文章
5浏览量
6664 -
奇偶校验
+关注
关注
0文章
15浏览量
8164
发布评论请先 登录
相关推荐
XMC4500-PSRAM和DSRAM中存在随机奇偶校验错误的原因?
我们将 XMC4500 用于功能安全应用。 有几个用户安装了 1000 个或更多控制器。
在这些现场安装中,我们每月在 PSRAM 和/或 DSRAM 中会遇到大约 1-2 个奇偶校验错误。 错误
发表于 01-26 06:30
9位奇偶校验发生器/校验器74HC280-Q100; 74HCT280-Q100数据手册
电子发烧友网站提供《9位奇偶校验发生器/校验器74HC280-Q100; 74HCT280-Q100数据手册.pdf》资料免费下载
发表于 01-18 15:20
•0次下载
ad2s1210解码芯片报配置奇偶校验错误故障且位置信息突变怎么解决?
您好,目前使用贵司ad2s1210解码芯片,遇到上电偶尔报奇偶校验故障,且电机运行中存在位置信息突变情况。 位置和故障信息都是在配置模式通过spi读取,位置突变时都是D7位由0变为1,例如:电机不动
发表于 12-01 06:05
奇偶校验和crc校验的区别 CRC校验和奇偶校验之间有什么关系?
奇偶校验和crc校验的区别 CRC校验和奇偶校验之间有什么关系? 奇偶校验和 CRC(Cyclic Redundancy Check)
什么是奇校验和偶校验?常见的奇偶校验方式有哪些?
什么是奇校验和偶校验?常见的奇偶校验方式有哪些? 1. 奇偶校验是指在数字通信中采用一种技术对传输的数据进行校验。由于数字信号传输容易受到干
串口通信奇偶检验什么意思 为什么要使用奇偶检验 怎么使用奇偶检验
串口通信奇偶检验什么意思 为什么要使用奇偶检验 怎么使用奇偶检验? 串口通信奇偶检验是指通过对串口传输数据的校验位进行
什么是奇偶校验电路?奇偶校验器是时序逻辑电路吗?
什么是奇偶校验电路?奇偶校验器是时序逻辑电路吗? 奇偶校验电路是一种数字电路,在数据传输过程中用于检测数据是否发生错误。在每个数据字节(通常是8位)的最高位添加一位(偶校验)或两位(奇
什么是奇偶校验 奇偶校验的基本原理 奇偶校验电路什么意思
什么是奇偶校验 奇偶校验的基本原理 奇偶校验电路什么意思 奇偶校验是一种用于检测二进制数据中错误的方法。它的基本原理是在二进制数据的末尾添加一个额外的位,使得数据中二进制 1 的数量
奇偶校验器的设计方法和特点
奇偶校验是一种简单、实现代价小的检错方式,常用在数据传输过程中。对于一组并行传输的数据(通常为8比特),可以计算岀它们的奇偶校验位并与其一起传输。接收端根据接收的数据重新计算其奇偶校验
如何实现一种基于FPGA的奇偶校验器设计?
奇偶校验是一种简单、实现代价小的检错方式,常用在数据传输过程中。对于一组并行传输的数据(通常为8比特),可以计算岀它们的奇偶校验位并与其一起传输。
发表于 09-05 10:38
•469次阅读
ML51EC0AE的奇偶校验怎么设置?
ML51EC0AE的奇偶校验是怎么设置的,可以发送数据但是设备一直不回复数据(设备是偶校验)搞了一天了也不行,应该是校验不对,麻烦大家看看,谢谢!
ACC=c;//发送的数据
TB8=P
发表于 06-16 07:16
FPGA奇偶校验的基本原理及实现方法
在数字电路中,数据的正确性非常重要。为了保证数据的正确性,在传输数据时需要添加一些冗余信息,以便在接收端进行校验。其中一种常用的校验方式是奇偶校验(Parity Check)。本文将介绍奇偶校
P2020数据缓存奇偶校验错误是怎么回事?
中央处理器:P2020
操作系统:linux-2.6.35
linux输出的错误信息如下:
内核:内核模式下的机器检查
内核:由(来自 MCSR = 10000000)引起:数据缓存奇偶校验错误
发表于 05-12 07:29
评论