色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

如何實現對通信數據的CRC計算

Q4MP_gh_c472c21 ? 來源:嵌入式ARM ? 作者:嵌入式ARM ? 2020-09-29 14:26 ? 次閱讀

前言

最近的工作中,要實現對通信數據的CRC計算,所以花了兩天的時間好好研究了一下,周末有時間整理了一下筆記。

一個完整的數據幀通常由以下部分構成:

校驗位是為了保證數據在傳輸過程中的完整性,采用一種指定的算法對原始數據進行計算,得出的一個校驗值。接收方接收到數據時,采用同樣的校驗算法對原始數據進行計算,如果計算結果和接收到的校驗值一致,說明數據校驗正確,這一幀數據可以使用,如果不一致,說明傳輸過程中出現了差錯,這一幀數據丟棄,請求重發。

常用的校驗算法有奇偶校驗、校驗和、CRC,還有LRC、BCC等不常用的校驗算法。

以串口通訊中的奇校驗為例,如果數據中1的個數為奇數,則奇校驗位0,否則為1。

例如原始數據為:0001 0011,數據中1的個數(或各位相加)為3,所以奇校驗位為0。這種校驗方法很簡單,但這種校驗方法有很大的誤碼率。假設由于傳輸過程中的干擾,接收端接收到的數據是0010 0011,通過奇校驗運算,得到奇校驗位的值為0,雖然校驗通過,但是數據已經發生了錯誤。

校驗和同理也會有類似的錯誤:

一個好的校驗校驗方法,配合數字信號編碼方式,如(差分)曼徹斯特編碼,(不)歸零碼等對數據進行編碼,可大大提高通信的健壯性和穩定性。例如以太網中使用的是CRC-32校驗,曼徹斯特編碼方式。本篇文章介紹CRC校驗的原理和實現方法。

CRC算法簡介

循環冗余校驗(Cyclic Redundancy Check, CRC)是一種根據網絡數據包或計算機文件等數據產生簡短固定位數校驗碼的一種信道編碼技術,主要用來檢測或校驗數據傳輸或者保存后可能出現的錯誤。它是利用除法及余數的原理來作錯誤偵測的。

CRC校驗計算速度快,檢錯能力強,易于用編碼器等硬件電路實現。從檢錯的正確率與速度、成本等方面,都比奇偶校驗等校驗方式具有優勢。因而,CRC 成為計算機信息通信領域最為普遍的校驗方式。常見應用有以太網/USB通信,壓縮解壓,視頻編碼,圖像存儲,磁盤讀寫等。

CRC參數模型

不知道你是否遇到過這種情況,同樣的CRC多項式,調用不同的CRC計算函數,得到的結果卻不一樣,而且和手算的結果也不一樣,這就涉及到CRC的參數模型了。計算一個正確的CRC值,需要知道CRC的參數模型。

一個完整的CRC參數模型應該包含以下信息:WIDTH,POLY,INIT,REFIN,REFOUT,XOROUT。

NAME:參數模型名稱。

WIDTH:寬度,即生成的CRC數據位寬,如CRC-8,生成的CRC為8位

POLY:十六進制多項式,省略最高位1,如 x8 + x2 + x + 1,二進制為1 0000 0111,省略最高位1,轉換為十六進制為0x07。

INIT:CRC初始值,和WIDTH位寬一致。

REFIN:true或false,在進行計算之前,原始數據是否翻轉,如原始數據:0x34 =0011 0100,如果REFIN為true,進行翻轉之后為0010 1100= 0x2c

REFOUT:true或false,運算完成之后,得到的CRC值是否進行翻轉,如計算得到的CRC值:0x97 =1001 0111,如果REFOUT為true,進行翻轉之后為11101001= 0xE9。

XOROUT:計算結果與此參數進行異或運算后得到最終的CRC值,和WIDTH位寬一致。

通常如果只給了一個多項式,其他的沒有說明則:INIT=0x00,REFIN=false,REFOUT=false,XOROUT=0x00。

常用的21個標準CRC參數模型:

CRC校驗在電子通信領域非常常用,可以說有通信存在的地方,就有CRC校驗:

美信(MAXIM)的芯片DS2401/DS18B20,都是使用的CRC-8/MAXIM模型

SD卡或MMC使用的是CRC-7/MMC模型

Modbus通信使用的是CRC-16/MODBUS參數模型

USB協議中使用的CRC-5/USB和CRC-16/USB模型

STM32自帶的硬件CRC計算模塊使用的是CRC-32模型

至于多項式的選擇,初始值和異或值的選擇,輸入輸出是否翻轉,這就涉及到一定的編碼和數學知識了。感興趣的朋友,可以了解一下每個CRC模型各個參數的來源。至于每種參數模型的檢錯能力、重復率,需要專業的數學計算了,不在本文討論的范疇內。

CRC計算

好了,了解了CRC參數模型知識,下面手算一個CRC值,來了解CRC計算的原理。

問:原始數據:0x34,使用CRC-8/MAXIN參數模型,求CRC值?

答:根據CRC參數模型表,得到CRC-8/MAXIN的參數如下:

POLY = 0x31 = 0011 0001(最高位1已經省略) INIT = 0x00 XOROUT = 0x00 REFIN = TRUE REFOUT = TRUE

有了上面的參數,這樣計算條件才算完整,下面來實際計算:

0.原始數據 = 0x34 =0011 0100,多項式 = 0x31 =1 0011 00011.INIT = 00,原始數據高8位和初始值進行異或運算保持不變。 2.REFIN為TRUE,需要先對原始數據進行翻轉:0011 0100 > 0010 11003.原始數據左移8位,即后面補8個0:0010 11000000 00004.把處理之后的數據和多項式進行模2除法,求得余數: 原始數據:0010 1100 0000 0000 = 10 1100 0000 0000多項式:1 0011 0001模2除法取余數低8位:1111 10115.與XOROUT進行異或,1111 1011 xor 0000 0000 = 1111 10116.因為REFOUT為TRUE,對結果進行翻轉得到最終的CRC-8值:1101 1111= 0xDF 7.數據+CRC:0011 0100 1101 1111= 34DF,相當于原始數據左移8位+余數。

模2除法求余數:

驗證手算結果:

可以看出是一致的,當你手算的結果和工具計算結果不一致時,可以看看INIT,XOROUT,REFINT,REFOUT這些參數是否一致,有1個參數不對,計算出的CRC結果都不一樣。

CRC校驗

上面通過筆算的方式,講解了CRC計算的原理,下面來介紹一下如何進行校驗。

按照上面CRC計算的結果,最終的數據幀:0011 0100 1101 1111= 34DF,前8位0011 0100是原始數據,后8位1101 1111是 CRC結果。

接收端的校驗有兩種方式,一種是和CRC計算一樣,在本地把接收到的數據和CRC分離,然后在本地對數據進行CRC運算,得到的CRC值和接收到的CRC進行比較,如果一致,說明數據接收正確,如果不一致,說明數據有錯誤。

另一種方法是把整個數據幀進行CRC運算,因為是數據幀相當于把原始數據左移8位,然后加上余數,如果直接對整個數據幀進行CRC運算(除以多項式),那么余數應該為0,如果不為0說明數據出錯。

而且,不同位出錯,余數也不同,可以證明,余數與出錯位數的對應關系只與CRC參數模型有關,而與原始數據無關。

CRC計算的C語言實現

無論是用C還是其他語言,實現方法網上很多,這里我找了一個基于C語言的CRC計算庫,里面包含了常用的21個CRC參數模型計算函數,可以直接使用,只有crcLib.c和crcLib.h兩個文件。

GitHub地址:https://github.com/whik/crc-lib-c

使用方法非常簡單:

#include #include #include "crcLib.h" int main() { uint8_t LENGTH = 10; uint8_t data[LENGTH]; uint8_t crc; for(int i = 0; i < LENGTH; i++) ? { ? ? ? ?data[i] = i*5; ? ? ? ?printf("%02x ", data[i]); ? } ? ?printf(" "); ? ?crc = crc8_maxim(data, LENGTH); ? ?printf("CRC-8/MAXIM:%02x ", crc); ? ?return 0; }

計算結果:

CRC計算工具

下面這幾款工具都可以自定義CRC算法模型,而且都有標準CRC模型可供選擇。如果自己用C語言或者Verilog實現校驗算法時,非常適合作為標準答案進行驗證。

在線計算:www.ip33.com/crc.html

離線計算工具:CRC_Calc v0.1.exe或者GCRC.exe

格西CRC計算器:

總結

CRC校驗并不能100%的檢查出數據的錯誤,非常低的概率會出現CRC校驗正確但數據中有錯誤位的情況。這和CRC的位數,多項式的選擇等等有很大的關系,所以在實際使用中盡量選擇標準CRC參數模型,這些多項式參數都是經過理論計算得出的,可以提高CRC的檢錯能力。CRC校驗可以檢錯,也可以糾正單一比特的錯誤,你知道糾錯的原理嗎?

參考資料

www.cnblogs.com/liushui-sky/p/9962123.html

segmentfault.com/a/1190000018094567

責任編輯:xj

原文標題:CRC校驗你會嗎?計算、校驗、C語言實現,三步教你輕松搞定

文章出處:【微信公眾號:嵌入式ARM】歡迎添加關注!文章轉載請注明出處。

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

    關注

    180

    文章

    7614

    瀏覽量

    137615
  • CRC校驗
    +關注

    關注

    0

    文章

    84

    瀏覽量

    15272

原文標題:CRC校驗你會嗎?計算、校驗、C語言實現,三步教你輕松搞定

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    求助,關于ADS125H02數據通訊格式及CRC校驗問題求解

    of the initial data. 第1條中,將所有數據“左移擴展為40bit,最右邊用1補齊”,與傳統的crc計算方法不一致,傳統的計算方法是在
    發表于 12-03 06:54

    HPLC通信與云計算的結合 HPLC通信信號處理方法

    快速、準確地傳輸大量數據。 云計算平臺具備強大的數據處理和分析能力,可以實時接收、處理和分析HPLC通信傳輸的數據。 通過云
    的頭像 發表于 12-02 14:13 ?201次閱讀

    ADS131B04-Q1 SPI通信時,為什么無法得到正常的CRC校驗?

    :邏輯分析數據與 這個芯片TI官方 SDK 的 readData()函數讀取類容相同, 但readData 函數的CRC校驗失敗,根據數據內容自己進行CRC
    發表于 11-22 06:40

    使用MSP430 MCU實現CRC

    電子發燒友網站提供《使用MSP430 MCU實現CRC.pdf》資料免費下載
    發表于 10-23 10:19 ?0次下載
    使用MSP430 MCU<b class='flag-5'>實現</b><b class='flag-5'>CRC</b>

    TAS5805內部的硬件CRC8對應標準的哪種? CRC校驗的數據是offset和value值嗎?

    TAS5805 內部的硬件 CRC8 對應標準的哪種? CRC 校驗的數據是 offset 和 value 值嗎?用 PPC 加載文件計算出來的值和在線
    發表于 10-12 06:19

    CRC實施

    電子發燒友網站提供《CRC實施.pdf》資料免費下載
    發表于 09-26 09:44 ?0次下載
    <b class='flag-5'>CRC</b>實施

    推動智慧交通建設,邊緣計算賦能交通信號燈數據處理與決策能力

    隨著智慧城市建設的快速發展,智慧交通已成為城市發展的重要組成項目。智慧交通旨在通過大數據、人工智能、物聯網等先進技術,實現交通系統的全面感知、智能分析、主動服務和協同管理。邊緣計算在交通信
    的頭像 發表于 07-25 16:04 ?795次閱讀
    推動智慧交通建設,邊緣<b class='flag-5'>計算</b>賦能交<b class='flag-5'>通信</b>號燈<b class='flag-5'>數據</b>處理與決策能力

    如何計算BMHD中的逆CRC值?

    更新各自的 CRC 和反向 CRC 值。 * 使用 IEEE 802.3 標準中定義的 CRC-32 多項式生成 CRC 值。 CRC
    發表于 05-31 06:43

    使用C語言實現CRC計算單元的例子

    使用C語言實現CRC計算單元的例子
    的頭像 發表于 05-16 16:16 ?1060次閱讀

    CRC(循環冗余校驗)應用舉例

    CRC(循環冗余校驗)應用舉例
    的頭像 發表于 05-16 16:12 ?1421次閱讀

    這個CRC計算單元是如何基于固定的生成多項式(0x4C11DB7)來獲取給定數據緩沖區的CRC碼的?

    這個CRC計算單元是如何基于固定的生成多項式(0x4C11DB7)來獲取給定數據緩沖區的CRC碼的?
    的頭像 發表于 05-16 16:06 ?984次閱讀

    用STM32L05x的CRC模塊做modbus CRC16計算,結果不正確是為什么?

    根據參考文檔,CRC模塊可以配置CRC多項式,應該可以做(Modbus)CRC16計算,自己試了一下,發現結果不正確,總是一個固定值,不知道為什么?另外多項式應該是0x8005還是0x
    發表于 04-29 06:50

    新版CubeMX CRC校驗模塊沒有Config嗎?

    最近發現CubeMX CRC 模塊config 部分沒有了,也就是用戶只能使能CRC模塊而不能對其做設置嗎。嘗試著生成工程看來一下發現默認的是CRC32,輸入數據 輸出
    發表于 04-03 08:04

    7系列FPGA中的POST_CRC錯誤檢測與恢復策略

    FPGA 在比特流被加載時計算 CRC 值,然后該值與在比特流加載結束時預期的 CRC 值進行比較。如果兩個值匹配,則FPGA 成功加載。
    發表于 02-28 14:58 ?985次閱讀
    7系列FPGA中的POST_<b class='flag-5'>CRC</b>錯誤檢測與恢復策略

    RA MCU中的CRC模塊和使用方法

    瑞薩RA單片機硬件CRC計算單元采用固定的多項式發生器來計算8位或者32位數據CRC校驗值,對數據
    發表于 02-26 11:45 ?1056次閱讀
    RA MCU中的<b class='flag-5'>CRC</b>模塊和使用方法
    主站蜘蛛池模板: 精品亚洲国产熟女福利自在线 | 亚洲性夜色噜噜噜网站2258KK | 动漫AV纯肉无码AV电影网 | 亚洲精品无码成人AAA片 | 国产精品99久久久久久人韩国 | 人妻中文字幕无码久久AV爆 | 欧美国产日韩久久久 | 九九精品视频在线播放 | 被滋润的艳妇疯狂呻吟白洁老七 | 狠日狠干日曰射 | 777ZYZ玖玖资源站最稳定网址 | 少妇高潮惨叫久久久久久电影 | 国产福利高清在线视频 | 野花视频在线观看免费最新动漫 | 草比比过程图 | 老师洗澡让我吃她胸的视频 | 日本夜夜夜 | 国产欧美日韩综合精品一区二区 | 祺鑫WRITEAS流出来了 | 96.8在线收听 | 中文字幕一区久久久久 | 欧美亚洲日本日韩在线 | 欧美特黄99久久毛片免费 | 女人高潮被爽到呻吟在线观看 | 久久久高清国产999尤物 | 成人中文字幕在线观看 | 国产成人免费网站在线观看 | 99久久久精品 | 成人免费毛片观看 | 2018年免费三级av观看 | 美娇妻的性奴史1一4 | 一个人的视频在线观看免费观看 | 亚洲春色AV无码专区456 | 男生脱美女内裤内衣动态图 | 王晶经典三级 | 伊人精品久久久大香线蕉99 | 国产成人久久精品AV | 99人精品福利在线观看 | 草草色| 久久99re热在线播放7 | 私密按摩师在线观看 百度网盘 |