国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

常用的數據差錯控制技術(1)-重復校驗

電子設計 ? 來源: 電子設計 ? 作者: 電子設計 ? 2020-10-30 11:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家講的是嵌入式里數據差錯控制技術 - 重復校驗。

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

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

一、重復校驗法基本原理

1.1 校驗依據

重復校驗法的校驗依據就是判斷重復傳輸的 q 組 n bits 二進制數據是否一致。

1.2 重復校驗位

為了實現重復校驗,就是不斷重復傳輸這組 n bits 原始數據 q 次即可,一次校驗的 q*n bits 數據塊中,僅有 n bits 數據是原始有效數據,校驗位就是那些重復的(q-1)*n bits 數據。是不是覺得簡單又粗暴?

1.3 校驗方法

假設原始數據塊是 X[n-1:0]共 n bits,重復次數為 q(q 一般為奇數),按重復傳輸方式,可分為兩個子類:

按 bit 重復:發送數據序列為,q 個 X0(X0X0...),q 個 X1(X1X1...)...,q 個 Xn-1(Xn-1Xn-1...)


按 block 重復:發送數據序列為,第 1 個 X[n-1:0],第 2 個 X[n-1:0]...,第 q 個 X[n-1:0]。

接受端收到數據后,逐次比較 q 個重復位,如完全一致,則認為沒有錯差;如不一致,則存在錯誤 bit。如需糾錯的話,原理也很簡單,判斷 q 個重復位里哪種數據位出現的次數多(這里解釋了 q 為何應是奇數)則為原始正確數據位。

1.4 C 代碼實現

實際中按 block 重復校驗法應用比較多,此處示例代碼以此為例:

安裝包:codeblocks-17.12mingw-setup.exe
集成環境:CodeBlocks 17.12 rev 11256
編譯器:GNU GCC 5.1.0
調試器:GNU gdb (GDB) 7.9.1

// repetition_code.c
//////////////////////////////////////////////////////////
#include
#include

/*!
* @brief 處理按 block 重復的數據塊
*
* @param src, 待處理的數據塊 .
* @param dest, 處理完成的原始數據 .
* @param lenInBytes, 待處理的數據塊長度 .
* @param repeatTimes, 數據重復次數(假定為奇數).
* @retval 0, 數據無錯誤位 .
* @retval 1, 數據有錯誤位且已糾正 .
*/
uint32_t verify_correct_repetition_block(uint8_t *src,
uint8_t *dest,
uint32_t lenInBytes,
uint32_t repeatTimes)
{
assert(repeatTimes % 2);
assert(!(lenInBytes % repeatTimes));

uint32_t result = 0;
uint32_t blockBytes = lenInBytes / repeatTimes;

// 遍歷一個 block 長度里每個 byte
for (uint32_t i = 0; i < blockBytes; i++)
{
// 遍歷當前 byte 的每個 bit
uint8_t correctByte = 0;
for (uint32_t j = 0; j < 8; j++)
{
// 遍歷當前 byte 的所有重復 byte
uint32_t bit1Count = 0;
for (uint32_t k = 0; k < repeatTimes; k++)
{
// 記錄所有重復 byte 中當前 bit 為 1 的個數
uint8_t countByte = *(src + i + k * blockBytes);
bit1Count += (countByte & (0x1u << j)) >> j;
}
// 當 bit1 出現半數則將當前 bit 認定為 1
if (bit1Count > (repeatTimes / 2))
{
correctByte |= 0x1u << j;
}
// 首次發現錯誤 bit 時,置位 result
if ((!result) && (bit1Count !=0) && bit1Count != repeatTimes)
{
result = 1;
}
}
// 將校驗后的 byte 存入 dest
*(dest + i) = correctByte;
}

return result;
}

// main.c
//////////////////////////////////////////////////////////
#include "repetition_code.h"
#include
#include

int main(void)
{
uint8_t src[3][4] = {{0x32, 0x33, 0x04, 0x08},
{0x32, 0x83, 0x04, 0xd8},
{0x31, 0x33, 0x04, 0xe8}};
uint8_t dest[4];
uint32_t result = verify_correct_repetition_block((uint8_t *)src, dest, sizeof(src), sizeof(src) / sizeof(src[0]));

printf("result = %d/n", result);
for (uint32_t i = 0; i < sizeof(dest); i++)
{
printf("dest[%d] = 0x%x/n", i, dest[i]);
}
return 0;
}

1.5 行業應用

實際上本文所講的單純的重復校驗法行業因為效率的原因,行業里較少應用,其改進版的實現 RA Codes 應用在了 FlexRay 協議里。

二、重復校驗法失效分析

重復校驗實現非常簡單,具有比較理想的檢錯能力,但效率太低,并未得到廣泛使用。即便犧牲了效率,但重復校驗法也存在如下 2 個缺陷,導致其檢錯糾錯并不可靠:

當重復 bit 全部發生錯誤時,會被誤認為沒有錯誤 bit 發生。


當錯誤 bit 出現概率大于原始 bit 時,在糾錯時會認定錯誤 bit 是原始 bit。

有沒有其他比重復校驗法更高效的檢錯方法?痞子衡在下篇會繼續聊。

至此,嵌入式里數據差錯控制技術之重復校驗痞子衡便介紹完畢了,掌聲在哪里~~~

審核編輯 黃昊宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制技術
    +關注

    關注

    3

    文章

    361

    瀏覽量

    34310
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    一文解讀CRC校驗

    1、CRC是用來干嘛的? 一般都知道是用來校驗的,檢測數據傳輸過程中是否出現錯誤(某些位,或某幾位,或者某塊區域位錯誤),一旦檢測。 2、CRC是否能校正數據傳輸中的錯誤? CRC只能
    發表于 01-26 07:20

    芯源循環冗余校驗(CRC)功能

    1 概述 循環冗余校驗(CRC) 主要應用于核實數據傳輸或數據存儲的正確性和完整性。CW32R030 內部集成CRC 計算單元, 支持采用多種CRC 算法對輸入
    發表于 01-12 06:07

    通訊數據求和取反加一校驗方法

    現在有一組通訊協議,但是我對校驗方法不熟悉導致通訊異常,想問問大神指點一下校驗方法-如圖所示我想給ID1的發送連接指令正確數據應該是怎樣的
    發表于 12-23 14:29

    UART偶校驗和奇校驗介紹

    校驗校驗位使一幀數據數據位和校驗位中“1”的總數為奇數。 偶
    發表于 12-15 06:02

    CS校驗原理與應用

    原理: CS校驗數據塊中所有字節(或字)進行累加求和,最終結果取模(通常是模 256 或 65536)后取補碼(或直接截斷)作為校驗值。 例如:8位校驗和 = (所有字節之和) mo
    發表于 11-19 07:51

    CRC校驗的原理和應用

    原理: CRC校驗數據視為一個二進制多項式,用一個預先定義好的生成多項式(Generator Polynomial) 進行模2除法,得到的余數作為CRC校驗碼。 例如:數據多項式 ÷
    發表于 11-14 06:48

    CRC校驗的本質和物理意義

    工業控制系統中,Modbus RTU協議的CRC校驗如同通信網絡的\"免疫系統\",某石化廠DCS系統曾因CRC計算錯誤導致0.3%的數據包丟失,引發連鎖控制故障。 一、CRC
    發表于 11-13 07:58

    進行數據校驗時如何保證場景覆蓋的全面性?

    數據校驗中保證場景覆蓋的全面性,核心是 從 “數據屬性 - 業務邏輯 - 異常邊界 - 環境交互” 多維度拆解場景 ,通過系統化梳理、優先級排序和動態迭代,避免因場景遺漏導致校驗漏洞
    的頭像 發表于 09-25 17:42 ?665次閱讀

    怎樣選擇適合的數據校驗系統時間同步硬件?

    在電能質量在線監測裝置的數據校驗系統中, 時間同步硬件的選擇需緊密匹配 “數據校驗準確性” 核心需求 (如多監測點數據時間戳一致性、
    的頭像 發表于 09-19 11:46 ?540次閱讀
    怎樣選擇適合的<b class='flag-5'>數據</b><b class='flag-5'>校驗</b>系統時間同步硬件?

    如何保證數據校驗系統的時間同步以提高準確性?

    在電能質量監測的數據校驗系統中, 時間同步的準確性直接決定了多監測點數據的時空一致性、暫態事件的時序匹配度,以及校驗結果的可信度 。要保證時間同步以提升
    的頭像 發表于 09-19 11:28 ?644次閱讀

    電能質量監測中,有哪些方法可以提高數據校驗系統的準確性?

    在電能質量監測中,數據校驗系統的準確性是保障監測數據可信度的核心,需從 “標準源精度、校準流程、硬件適配、算法優化、時間同步、運維管理” 等多維度構建提升方案,針對性解決 “信號失真、參數偏差、環境
    的頭像 發表于 09-19 10:03 ?612次閱讀

    如何制定電能質量在線監測裝置的數據校驗標準?

    制定電能質量在線監測裝置(以下簡稱 “監測裝置”)的數據校驗標準,需以 確保數據準確性、可靠性、一致性 為核心目標,結合國際 / 國內通用規范、實際應用場景(如工業、民用、電網側)及監測裝置的
    的頭像 發表于 09-18 11:40 ?763次閱讀
    如何制定電能質量在線監測裝置的<b class='flag-5'>數據</b><b class='flag-5'>校驗</b>標準?

    如何確保電能質量在線監測裝置的數據校驗的準確性?

    確保電能質量在線監測裝置(以下簡稱 “監測裝置”)數據校驗的準確性,需圍繞 “ 標準溯源、流程規范、環境控制數據審核、全周期追溯 ” 五大核心環節,建立全鏈條管控機制,覆蓋
    的頭像 發表于 09-18 11:05 ?591次閱讀
    如何確保電能質量在線監測裝置的<b class='flag-5'>數據</b><b class='flag-5'>校驗</b>的準確性?

    KT6368A藍牙芯片應該自帶數據校驗機制嗎?

    KT6368A藍牙芯片應該自帶數據校驗機制嗎?
    的頭像 發表于 04-19 16:34 ?1147次閱讀
    KT6368A藍牙芯片應該自帶<b class='flag-5'>數據</b><b class='flag-5'>校驗</b>機制嗎?

    基于Verilog語言實現CRC校驗

    CRC即循環冗余校驗碼:是數據通信領域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環冗余檢查(CRC)是一種
    的頭像 發表于 03-24 10:36 ?2531次閱讀
    基于Verilog語言實現CRC<b class='flag-5'>校驗</b>