0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

奇偶校验的优缺点及奇偶校验代码实现

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-06-18 18:14 次阅读

奇偶校验需要一位校验位,即使用串口通信的方式2或方式3(8位数据位+1位校验位)。

奇校验(odd parity):让传输的数据(包含校验位)中1的个数为奇数。

即:如果传输字节中1的个数是偶数,则校验位为“1”,奇数相反。

以发送字符:10101010为例

pYYBAGKtpaGALXtWAABMyPR8Bw0064.jpg

偶校验(even parity):让传输的数据(包含校验位)中1的个数为偶数。

即:如果传输字节中1的个数是偶数,则校验位为“0”,奇数相反。

还是以发送字符:10101010为例

poYBAGKtpaGASc73AABKhJU49Ck446.jpg

数据和校验位发送给接受方后,接收方再次对数据中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

    浏览量

    6694
  • 奇偶校验
    +关注

    关注

    0

    文章

    15

    浏览量

    8193
收藏 人收藏

    评论

    相关推荐

    如何通过I2C加载TPS2388x SRAM和奇偶校验代码

    电子发烧友网站提供《如何通过I2C加载TPS2388x SRAM和奇偶校验代码.pdf》资料免费下载
    发表于 09-06 11:16 0次下载
    如何通过I2C加载TPS2388x SRAM和<b class='flag-5'>奇偶校验</b><b class='flag-5'>代码</b>

    Traveo T2G SRAM不是32位的吗?如何得到一个64位的?

    在进行sram的ecc故障注入的时候,需要计算其ecc校验值,在手册上有这样的描述 10.3.4 由软件生成 ECC 奇偶校验 要注入 ECC 错误以生成故障,必须由软件生成 ECC 奇偶校验
    发表于 06-03 08:49

    8位到9位奇偶校验总线收发器ABT8338数据表

    电子发烧友网站提供《8位到9位奇偶校验总线收发器ABT8338数据表.pdf》资料免费下载
    发表于 05-30 10:02 0次下载
    8位到9位<b class='flag-5'>奇偶校验</b>总线收发器ABT8338数据表

    奇偶校验发生器/校验器和3态输出的16位收发器ABT16657数据表

    电子发烧友网站提供《带奇偶校验发生器/校验器和3态输出的16位收发器ABT16657数据表.pdf》资料免费下载
    发表于 05-30 09:45 0次下载
    带<b class='flag-5'>奇偶校验</b>发生器/<b class='flag-5'>校验</b>器和3态输出的16位收发器ABT16657数据表

    8位到9位奇偶校验总线收发器SN74BCT29854数据表

    电子发烧友网站提供《8位到9位奇偶校验总线收发器SN74BCT29854数据表.pdf》资料免费下载
    发表于 05-29 09:50 0次下载
    8位到9位<b class='flag-5'>奇偶校验</b>总线收发器SN74BCT29854数据表

    奇偶校验发生器/校验器和3态输出的八进制收发器SN74F657数据表

    电子发烧友网站提供《带奇偶校验发生器/校验器和3态输出的八进制收发器SN74F657数据表.pdf》资料免费下载
    发表于 05-29 09:44 0次下载
    带<b class='flag-5'>奇偶校验</b>发生器/<b class='flag-5'>校验</b>器和3态输出的八进制收发器SN74F657数据表

    奇偶校验器和双3态输出的3.3-V 12位通用总线驱动器SN74ALVCH16903数据表

    电子发烧友网站提供《带奇偶校验器和双3态输出的3.3-V 12位通用总线驱动器SN74ALVCH16903数据表.pdf》资料免费下载
    发表于 05-29 09:31 0次下载
    带<b class='flag-5'>奇偶校验</b>器和双3态输出的3.3-V 12位通用总线驱动器SN74ALVCH16903数据表

    双8位至9位奇偶校验总线收发器ABT16833数据表

    电子发烧友网站提供《双8位至9位奇偶校验总线收发器ABT16833数据表.pdf》资料免费下载
    发表于 05-24 09:29 0次下载
    双8位至9位<b class='flag-5'>奇偶校验</b>总线收发器ABT16833数据表

    做lora通讯用到usart,配置时遇到的usart奇偶校验问题求解

    今天做lora通讯,用到usart,配置时发现usart奇偶校验困惑。假如CR1->M、CR1->PCE、CR1->PS均置位即发送9位数据(含最高
    发表于 05-20 08:30

    8位到9位奇偶校验总线收发器数据表

    电子发烧友网站提供《8位到9位奇偶校验总线收发器数据表.pdf》资料免费下载
    发表于 05-15 09:33 0次下载
    8位到9位<b class='flag-5'>奇偶校验</b>总线收发器数据表

    STM8S105K4串口2无奇偶校验,也能接收偶校验的数据为什么?

    MCU STM8S105K4 设置为一个起始为,8个数据位,无校验,一个停止位,用串口助手 发送能够 接收的数据,还是正确的, static void UART_Config(void
    发表于 04-10 08:27

    浅析MCU通信、存储常用的简单校验算法

    UART有一个奇偶校验,CAN通信有CRC校验。Modbus、MAVlink、USB等通信协议也有校验信息。
    的头像 发表于 03-07 10:56 457次阅读
    浅析MCU通信、存储常用的简单<b class='flag-5'>校验</b>算法

    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次下载
    9位<b class='flag-5'>奇偶校验</b>发生器/<b class='flag-5'>校验</b>器74HC280-Q100; 74HCT280-Q100数据手册

    ad2s1210解码芯片报配置奇偶校验错误故障且位置信息突变怎么解决?

    您好,目前使用贵司ad2s1210解码芯片,遇到上电偶尔报奇偶校验故障,且电机运行中存在位置信息突变情况。 位置和故障信息都是在配置模式通过spi读取,位置突变时都是D7位由0变为1,例如:电机不动
    发表于 12-01 06:05