痞子衡隨筆:常用的數據傳輸差錯檢測技術(1)- 奇偶校驗(Parity Check)

来源:https://www.cnblogs.com/henjay724/archive/2018/02/21/8457391.html
-Advertisement-
Play Games

在嵌入式應用里,除了最核心的數據處理外,我們還會經常和數據傳輸打交道。在使用傳輸介面傳輸數據時避不可免會遇到一個問題,如果傳輸過程中遇到未知硬體干擾發生bit錯誤怎麼辦? 今天給大家講的就是數據傳輸過程中用於差錯檢測的最簡單的方法,即奇偶校驗法。 ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家講的是嵌入式數據傳輸里的差錯檢測技術-奇偶校驗

  在嵌入式應用里,除了最核心的數據處理外,我們還會經常和數據傳輸打交道。數據傳輸需要硬體傳輸介面的支持,串列介面由於占用引腳少的優點目前應用比並行介面廣泛,常用的串列介面種類非常多,比如UART,SPI,I2C,USB等,在使用這些介面傳輸數據時避不可免會遇到一個問題,如果傳輸過程中遇到未知硬體干擾發生bit錯誤怎麼辦?

  痞子衡今天給大家講的就是數據傳輸過程中用於差錯檢測的最簡單的方法,即奇偶校驗法。

一、奇偶校驗法基本原理

1.1 校驗依據

  奇偶校驗法的校驗依據就是判斷傳輸的一組二進位數據中"1"的個數是奇數還是偶數,所以其實奇偶檢驗法有兩個子類:

  • 奇校驗:如果以二進位數據中1的個數是奇數為依據,則是奇校驗
  • 偶校驗:如果以二進位數據中1的個數是偶數為依據,則是偶校驗

  一般在同步傳輸方式中常採用奇校驗,而在非同步傳輸方式中常採用偶校驗。

1.2 奇偶校驗位

  為了實現奇偶校驗,通常會在傳輸的這組二進位數據中插入一個額外的奇偶校驗位(bit),用它來確保發送出去的這組二進位數據中“1”的個數為奇數或偶數。
  劃重點,奇偶校驗位並不是用來標記原始傳輸數據中1的個數是奇數還是偶數,而是用來確保原始數據加上奇偶校驗位後的合成數據中1的個數是奇數或者偶數。

1.3 校驗方法

  常用的奇偶校驗共有三種:水平奇偶校驗,垂直奇偶校驗校驗和水平垂直奇偶校驗。以對32位數據:10100101 10111001 10000100 00011010進行校驗為例講解:

  • 水平奇偶校驗:對每一種數據的編碼添加校驗位,使信息位與校驗位處於同一行。
原始數據 水平奇校驗位 水平偶校驗位
10100101 1 0
10111001 0 1
10000100 1 0
00011010 0 1

  所以加上水平偶校驗位後應傳輸的數據是:101001010 101110011 100001000 000110101

  • 垂直奇偶校驗:將數據分為若幹組,一組一行,再加上一行校驗位,針對每一列採樣奇校驗或偶校驗。
編碼分類 垂直奇校驗 垂直偶校驗
原始數據 10100101 10100101
10111001 10111001
10000100 10000100
00011010 00011010
校驗位 01111101 10000010

  所以加上垂直偶校驗位後應傳輸的數據是:10100101 10111001 10000100 0001101010000010

  • 水平垂直奇偶校驗:也叫Hamming Code,其是在水平和垂直方向上進行雙校驗,其不僅可以檢測2bit錯誤的具體位置,還可糾正1bit錯誤,常用於NAND Flash里。這部分不屬於本文要討論的內容,痞子衡後續會專門介紹Hamming Code。

1.4 C代碼實現

  實際中水平校驗法應用比較多,此處示例代碼以水平奇校驗為例:

// 獲取當前byte的極性
// 如byte極性(含1的個數)為奇數,返回ture;否則返回false
bool is_byte_odd_parity(uint8_t byte)
{
    bool parity = false;
    // 普通演算法-byte逐位異或(需迴圈8次)
    /*
    for (uint8_t i = 0; i < 8; i++)
    {
        parity ^= byte & 0x01u;
        byte >>= 1;
    }
    */
    // 效率較高演算法-計數byte中1的個數(需迴圈n次,n為byte中1的個數)
    while (byte)
    {
        parity = !parity;
        byte &= byte - 1;
    }
    return parity;
}

// 獲取給定data的奇校驗位
uint32_t get_data_parity(uint8_t *src,
                         uint32_t lenInBytes)
{
    uint32_t result = 0;
    // 水平校驗法
    // isDataOddParity用於判斷所有data bits的行極性是否為奇
    bool isDataOddParity = false;
    while (lenInBytes--)
    {
        isDataOddParity ^= is_byte_odd_parity(*src++)
    }
    // result為所有data bits的奇校驗位
    result = !isDataOddParity;

    return result;
}

1.5 行業應用

  奇偶檢驗比較典型的應用是在串口UART上,玩過UART的朋友肯定瞭解串口奇偶檢驗位的作用,包括下位機MCU UART驅動的編寫,上位機串口調試助手的設置都需要註意奇偶校驗位。下圖是UART傳輸時序圖,奇偶校驗位是可選位,僅當使能時才會生效。不過作為嵌入式開發者,倒不必關註奇偶校驗的具體實現,因為MCU的UART模塊已經在硬體上支持了奇偶檢驗,我們只需要操作UART對應寄存器的控制位去使能奇偶檢驗功能即可。

二、奇偶校驗法失效分析

  在現實數據傳輸中,偶爾1位出錯的機會最多,2位及以上發生錯誤的概率比較低,且由於奇偶校驗實現簡單,具有相對理想的檢錯能力,因此得到廣泛使用。但奇偶校驗法有如下2個明顯的缺陷:

  • 奇數位誤碼能檢出,偶數位誤碼不能檢出
  • 不能糾錯,在發現錯誤後,只能要求重發。

  有沒有其他比奇偶校驗法更好的檢錯方法?痞子衡在下篇會繼續聊。

  至此,嵌入式數據傳輸里的差錯檢測技術之奇偶校驗痞子衡便介紹完畢了,掌聲在哪裡~~~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目描述 Description 有n堆石子排成一列,每堆石子有一個重量w[i], 每次合併可以合併相鄰的兩堆石子,一次合併的代價為兩堆石子的重量和w[i]+w[i+1]。問安排怎樣的合併順序,能夠使得總合併代價達到最小。 題目描述 Description 有n堆石子排成一列,每堆石子有一個重量w[ ...
  • 題目描述 P教授要去看奧運,但是他舍不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。P教授有編號為1...N的N件玩具,第i件玩具經過壓縮後變成一維長度為Ci.為了方便整理,P教授要求在一個一維容器中的玩具編號是連續的。 ...
  • 一、線程和進程 進程(Process): 1、是電腦中的程式關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。 2、在早期面向進程設計的電腦結構中,進程是程式的基本執行實體。 3、在當代面向線程設計的電腦結構中,進程是線程的容器。程式是指令、數據及其組織 ...
  • 一.Django內置admi a.配置路由 b.定製admin 在admin.py中只需要講Mode中的某個類註冊,即可在Admin中實現增刪改查的功能,如: 3.ModelAdmin中提供了大量的可定製功能,如: 1. list_display,列表時,定製顯示的列。 2. list_displa ...
  • 摘要:學習c#已經有一段歷程了,回顧之前所打過的代碼以及筆記,做些常用的總結,希望以後工作中如果用到,方便查找。當然,個人首要目的是這樣,加深印象的同時,可以練習一下打字速度。希望也 堅持。當然,如果對其他人能帶來一點點幫助的話,那更好啦。 本文涉及內容: 1、常用對字元串操作 2、集合 3、文件操 ...
  • 在之前寫的這篇文章 WPF: 只讀依賴屬性的介紹與實踐 中,我們介紹了在 WPF 自定義控制項中如何添加只讀依賴屬性,並且使其結合屬性觸發器 (Trigger) 來實現對控制項樣式的改變。事實上,關於觸發器,在 WPF 中除了屬性觸發器,還有事件觸發器 (EventTrigger) 和數據觸發器 (Da ...
  • linux安裝git包 很多yum源上自動安裝的git版本為1.7,這裡手動編譯重新安裝1:安裝依賴包yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMak ...
  • DNS功能變數名稱記錄 DNS資料庫 區域傳輸 正解和反解在zone記錄當中是由眾多的RR(resource record)組成 資源記錄定義的格式 資源類型的定義:rr_type ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...