0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

奇偶校驗的優(yōu)缺點及奇偶校驗代碼實現(xiàn)

嵌入式應用開發(fā) ? 來源:嵌入式應用開發(fā) ? 作者:嵌入式應用開發(fā) ? 2022-06-18 18:14 ? 次閱讀

奇偶校驗需要一位校驗位,即使用串口通信的方式2或方式3(8位數(shù)據(jù)位+1位校驗位)。

奇校驗(odd parity):讓傳輸?shù)臄?shù)據(jù)(包含校驗位)中1的個數(shù)為奇數(shù)。

即:如果傳輸字節(jié)中1的個數(shù)是偶數(shù),則校驗位為“1”,奇數(shù)相反。

以發(fā)送字符:10101010為例

pYYBAGKtpaGALXtWAABMyPR8Bw0064.jpg

偶校驗(even parity):讓傳輸?shù)臄?shù)據(jù)(包含校驗位)中1的個數(shù)為偶數(shù)。

即:如果傳輸字節(jié)中1的個數(shù)是偶數(shù),則校驗位為“0”,奇數(shù)相反。

還是以發(fā)送字符:10101010為例

poYBAGKtpaGASc73AABKhJU49Ck446.jpg

數(shù)據(jù)和校驗位發(fā)送給接受方后,接收方再次對數(shù)據(jù)中1的個數(shù)進行計算,如果為奇數(shù)則校驗通過,表示此次傳輸過程未發(fā)生錯誤。如果不是奇數(shù),則表示有錯誤發(fā)生,此時接收方可以向發(fā)送方發(fā)送請求,要求重新發(fā)送一遍數(shù)據(jù)。

優(yōu)缺點:

  • 奇偶校驗的檢錯率只有50%,因為只有奇數(shù)個數(shù)據(jù)位發(fā)生變化能檢測到,如果偶數(shù)個數(shù)據(jù)位發(fā)生變化則無能為力了╮(╯﹏╰)╭
  • 奇偶校驗每傳輸一個字節(jié)都需要加一位校驗位,對傳輸效率影響很大。
  • 奇偶校驗只能發(fā)現(xiàn)錯誤,但不能糾正錯誤,也就是說它只能告訴你出錯了,但不能告訴你怎么出錯了,一旦發(fā)現(xiàn)錯誤,只好重發(fā)。
  • 雖然奇偶校驗有很多缺點,但因為其使用起來十分簡單,故目前仍被廣泛使用。

應用:

如何用編程確定一個字節(jié)中“1”個數(shù)的奇偶性?我們可以利用二進制數(shù)相加的特點:

0+0=0、1+0=1、1+1=0

可以看出,如果我們將一個字節(jié)的所有位相加

  • 有奇數(shù)個“1”的字節(jié)的和為1
  • 有偶數(shù)個“1”的字節(jié)的和為0

由此即可通過編程完成判斷。實際應用中,實現(xiàn)方法很多,但這是相對簡單的一種,這里不再贅述。

代碼實現(xiàn)部分如下:

#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不同的個數(shù)
        cnt += temp;//cnt記錄二進制下data中1的個數(shù)
    }

    unsigned char ans = data << 1;//左移1位 
    
    if (cnt % 2 == 0)//當cnt能夠被2整除,即cnt是偶數(shù),即1的個數(shù)是偶數(shù)
    {
        ans += 1;//在最右邊加1
    }
    else//當cnt不能夠被2整除,即cnt是奇數(shù),即1的個數(shù)是奇數(shù)
    {
        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不同的個數(shù)
        cnt += temp;//cnt記錄二進制下data中1的個數(shù)
    }

    unsigned char ans = data << 1;//左移1位 
    
    if (cnt % 2 == 0)//當cnt能夠被2整除,即cnt是偶數(shù),即1的個數(shù)是偶數(shù)
    {
        ans += 0;//在最右邊加0
    }
    else//當cnt不能夠被2整除,即cnt是奇數(shù),即1的個數(shù)是奇數(shù)
    {
        ans += 1;//在最右邊加1
    }
    return ans;
}

int main()
{
    char a;
    unsigned char b;
    scanf("%c", &a);
    b = add(a);
    printf("2進制結(jié)果表示為:");//輸出b的2進制表示
    for (int i = 7; i >= 0; i--) {
        if (((b>>i) & 1) == 1)
            printf("1");
        else
            printf("0");
    } putchar(10);
    
    return 0;
}

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式C
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    6694
  • 奇偶校驗
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    8193
收藏 人收藏

    評論

    相關(guān)推薦

    如何通過I2C加載TPS2388x SRAM和奇偶校驗代碼

    電子發(fā)燒友網(wǎng)站提供《如何通過I2C加載TPS2388x SRAM和奇偶校驗代碼.pdf》資料免費下載
    發(fā)表于 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 奇偶校驗
    發(fā)表于 06-03 08:49

    8位到9位奇偶校驗總線收發(fā)器ABT8338數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《8位到9位奇偶校驗總線收發(fā)器ABT8338數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 05-30 10:02 ?0次下載
    8位到9位<b class='flag-5'>奇偶校驗</b>總線收發(fā)器ABT8338數(shù)據(jù)表

    奇偶校驗發(fā)生器/校驗器和3態(tài)輸出的16位收發(fā)器ABT16657數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《帶奇偶校驗發(fā)生器/校驗器和3態(tài)輸出的16位收發(fā)器ABT16657數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 05-30 09:45 ?0次下載
    帶<b class='flag-5'>奇偶校驗</b>發(fā)生器/<b class='flag-5'>校驗</b>器和3態(tài)輸出的16位收發(fā)器ABT16657數(shù)據(jù)表

    8位到9位奇偶校驗總線收發(fā)器SN74BCT29854數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《8位到9位奇偶校驗總線收發(fā)器SN74BCT29854數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 05-29 09:50 ?0次下載
    8位到9位<b class='flag-5'>奇偶校驗</b>總線收發(fā)器SN74BCT29854數(shù)據(jù)表

    奇偶校驗發(fā)生器/校驗器和3態(tài)輸出的八進制收發(fā)器SN74F657數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《帶奇偶校驗發(fā)生器/校驗器和3態(tài)輸出的八進制收發(fā)器SN74F657數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 05-29 09:44 ?0次下載
    帶<b class='flag-5'>奇偶校驗</b>發(fā)生器/<b class='flag-5'>校驗</b>器和3態(tài)輸出的八進制收發(fā)器SN74F657數(shù)據(jù)表

    奇偶校驗器和雙3態(tài)輸出的3.3-V 12位通用總線驅(qū)動器SN74ALVCH16903數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《帶奇偶校驗器和雙3態(tài)輸出的3.3-V 12位通用總線驅(qū)動器SN74ALVCH16903數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 05-29 09:31 ?0次下載
    帶<b class='flag-5'>奇偶校驗</b>器和雙3態(tài)輸出的3.3-V 12位通用總線驅(qū)動器SN74ALVCH16903數(shù)據(jù)表

    雙8位至9位奇偶校驗總線收發(fā)器ABT16833數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《雙8位至9位奇偶校驗總線收發(fā)器ABT16833數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 05-24 09:29 ?0次下載
    雙8位至9位<b class='flag-5'>奇偶校驗</b>總線收發(fā)器ABT16833數(shù)據(jù)表

    做lora通訊用到usart,配置時遇到的usart奇偶校驗問題求解

    今天做lora通訊,用到usart,配置時發(fā)現(xiàn)usart奇偶校驗困惑。假如CR1->M、CR1->PCE、CR1->PS均置位即發(fā)送9位數(shù)據(jù)(含最高
    發(fā)表于 05-20 08:30

    8位到9位奇偶校驗總線收發(fā)器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《8位到9位奇偶校驗總線收發(fā)器數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 05-15 09:33 ?0次下載
    8位到9位<b class='flag-5'>奇偶校驗</b>總線收發(fā)器數(shù)據(jù)表

    STM8S105K4串口2無奇偶校驗,也能接收偶校驗的數(shù)據(jù)為什么?

    MCU STM8S105K4 設(shè)置為一個起始為,8個數(shù)據(jù)位,無校驗,一個停止位,用串口助手 發(fā)送能夠 接收的數(shù)據(jù),還是正確的, static void UART_Config(void
    發(fā)表于 04-10 08:27

    淺析MCU通信、存儲常用的簡單校驗算法

    UART有一個奇偶校驗,CAN通信有CRC校驗。Modbus、MAVlink、USB等通信協(xié)議也有校驗信息。
    的頭像 發(fā)表于 03-07 10:56 ?462次閱讀
    淺析MCU通信、存儲常用的簡單<b class='flag-5'>校驗</b>算法

    XMC4500-PSRAM和DSRAM中存在隨機奇偶校驗錯誤的原因?

    我們將 XMC4500 用于功能安全應用。 有幾個用戶安裝了 1000 個或更多控制器。 在這些現(xiàn)場安裝中,我們每月在 PSRAM 和/或 DSRAM 中會遇到大約 1-2 個奇偶校驗錯誤。 錯誤
    發(fā)表于 01-26 06:30

    9位奇偶校驗發(fā)生器/校驗器74HC280-Q100; 74HCT280-Q100數(shù)據(jù)手冊

    電子發(fā)燒友網(wǎng)站提供《9位奇偶校驗發(fā)生器/校驗器74HC280-Q100; 74HCT280-Q100數(shù)據(jù)手冊.pdf》資料免費下載
    發(fā)表于 01-18 15:20 ?0次下載
    9位<b class='flag-5'>奇偶校驗</b>發(fā)生器/<b class='flag-5'>校驗</b>器74HC280-Q100; 74HCT280-Q100數(shù)據(jù)手冊

    ad2s1210解碼芯片報配置奇偶校驗錯誤故障且位置信息突變怎么解決?

    您好,目前使用貴司ad2s1210解碼芯片,遇到上電偶爾報奇偶校驗故障,且電機運行中存在位置信息突變情況。 位置和故障信息都是在配置模式通過spi讀取,位置突變時都是D7位由0變?yōu)?,例如:電機不動
    發(fā)表于 12-01 06:05