在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

如何實(shí)現(xiàn)對通信數(shù)據(jù)的CRC計(jì)算

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

前言

最近的工作中,要實(shí)現(xiàn)對通信數(shù)據(jù)的CRC計(jì)算,所以花了兩天的時(shí)間好好研究了一下,周末有時(shí)間整理了一下筆記。

一個(gè)完整的數(shù)據(jù)幀通常由以下部分構(gòu)成:

校驗(yàn)位是為了保證數(shù)據(jù)在傳輸過程中的完整性,采用一種指定的算法對原始數(shù)據(jù)進(jìn)行計(jì)算,得出的一個(gè)校驗(yàn)值。接收方接收到數(shù)據(jù)時(shí),采用同樣的校驗(yàn)算法對原始數(shù)據(jù)進(jìn)行計(jì)算,如果計(jì)算結(jié)果和接收到的校驗(yàn)值一致,說明數(shù)據(jù)校驗(yàn)正確,這一幀數(shù)據(jù)可以使用,如果不一致,說明傳輸過程中出現(xiàn)了差錯(cuò),這一幀數(shù)據(jù)丟棄,請求重發(fā)。

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

以串口通訊中的奇校驗(yàn)為例,如果數(shù)據(jù)中1的個(gè)數(shù)為奇數(shù),則奇校驗(yàn)位0,否則為1。

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

校驗(yàn)和同理也會有類似的錯(cuò)誤:

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

CRC算法簡介

循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check, CRC)是一種根據(jù)網(wǎng)絡(luò)數(shù)據(jù)包或計(jì)算機(jī)文件等數(shù)據(jù)產(chǎn)生簡短固定位數(shù)校驗(yàn)碼的一種信道編碼技術(shù),主要用來檢測或校驗(yàn)數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯(cuò)誤。它是利用除法及余數(shù)的原理來作錯(cuò)誤偵測的。

CRC校驗(yàn)計(jì)算速度快,檢錯(cuò)能力強(qiáng),易于用編碼器等硬件電路實(shí)現(xiàn)。從檢錯(cuò)的正確率與速度、成本等方面,都比奇偶校驗(yàn)等校驗(yàn)方式具有優(yōu)勢。因而,CRC 成為計(jì)算機(jī)信息通信領(lǐng)域最為普遍的校驗(yàn)方式。常見應(yīng)用有以太網(wǎng)/USB通信,壓縮解壓,視頻編碼,圖像存儲,磁盤讀寫等。

CRC參數(shù)模型

不知道你是否遇到過這種情況,同樣的CRC多項(xiàng)式,調(diào)用不同的CRC計(jì)算函數(shù),得到的結(jié)果卻不一樣,而且和手算的結(jié)果也不一樣,這就涉及到CRC的參數(shù)模型了。計(jì)算一個(gè)正確的CRC值,需要知道CRC的參數(shù)模型。

一個(gè)完整的CRC參數(shù)模型應(yīng)該包含以下信息:WIDTH,POLY,INIT,REFIN,REFOUT,XOROUT。

NAME:參數(shù)模型名稱。

WIDTH:寬度,即生成的CRC數(shù)據(jù)位寬,如CRC-8,生成的CRC為8位

POLY:十六進(jìn)制多項(xiàng)式,省略最高位1,如 x8 + x2 + x + 1,二進(jìn)制為1 0000 0111,省略最高位1,轉(zhuǎn)換為十六進(jìn)制為0x07。

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

REFIN:true或false,在進(jìn)行計(jì)算之前,原始數(shù)據(jù)是否翻轉(zhuǎn),如原始數(shù)據(jù):0x34 =0011 0100,如果REFIN為true,進(jìn)行翻轉(zhuǎn)之后為0010 1100= 0x2c

REFOUT:true或false,運(yùn)算完成之后,得到的CRC值是否進(jìn)行翻轉(zhuǎn),如計(jì)算得到的CRC值:0x97 =1001 0111,如果REFOUT為true,進(jìn)行翻轉(zhuǎn)之后為11101001= 0xE9。

XOROUT:計(jì)算結(jié)果與此參數(shù)進(jìn)行異或運(yùn)算后得到最終的CRC值,和WIDTH位寬一致。

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

常用的21個(gè)標(biāo)準(zhǔn)CRC參數(shù)模型:

CRC校驗(yàn)在電子通信領(lǐng)域非常常用,可以說有通信存在的地方,就有CRC校驗(yàn):

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

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

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

USB協(xié)議中使用的CRC-5/USB和CRC-16/USB模型

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

至于多項(xiàng)式的選擇,初始值和異或值的選擇,輸入輸出是否翻轉(zhuǎn),這就涉及到一定的編碼和數(shù)學(xué)知識了。感興趣的朋友,可以了解一下每個(gè)CRC模型各個(gè)參數(shù)的來源。至于每種參數(shù)模型的檢錯(cuò)能力、重復(fù)率,需要專業(yè)的數(shù)學(xué)計(jì)算了,不在本文討論的范疇內(nèi)。

CRC計(jì)算

好了,了解了CRC參數(shù)模型知識,下面手算一個(gè)CRC值,來了解CRC計(jì)算的原理。

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

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

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

有了上面的參數(shù),這樣計(jì)算條件才算完整,下面來實(shí)際計(jì)算:

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

模2除法求余數(shù):

驗(yàn)證手算結(jié)果:

可以看出是一致的,當(dāng)你手算的結(jié)果和工具計(jì)算結(jié)果不一致時(shí),可以看看INIT,XOROUT,REFINT,REFOUT這些參數(shù)是否一致,有1個(gè)參數(shù)不對,計(jì)算出的CRC結(jié)果都不一樣。

CRC校驗(yàn)

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

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

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

另一種方法是把整個(gè)數(shù)據(jù)幀進(jìn)行CRC運(yùn)算,因?yàn)槭菙?shù)據(jù)幀相當(dāng)于把原始數(shù)據(jù)左移8位,然后加上余數(shù),如果直接對整個(gè)數(shù)據(jù)幀進(jìn)行CRC運(yùn)算(除以多項(xiàng)式),那么余數(shù)應(yīng)該為0,如果不為0說明數(shù)據(jù)出錯(cuò)。

而且,不同位出錯(cuò),余數(shù)也不同,可以證明,余數(shù)與出錯(cuò)位數(shù)的對應(yīng)關(guān)系只與CRC參數(shù)模型有關(guān),而與原始數(shù)據(jù)無關(guān)。

CRC計(jì)算的C語言實(shí)現(xiàn)

無論是用C還是其他語言,實(shí)現(xiàn)方法網(wǎng)上很多,這里我找了一個(gè)基于C語言的CRC計(jì)算庫,里面包含了常用的21個(gè)CRC參數(shù)模型計(jì)算函數(shù),可以直接使用,只有crcLib.c和crcLib.h兩個(gè)文件。

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; }

計(jì)算結(jié)果:

CRC計(jì)算工具

下面這幾款工具都可以自定義CRC算法模型,而且都有標(biāo)準(zhǔn)CRC模型可供選擇。如果自己用C語言或者Verilog實(shí)現(xiàn)校驗(yàn)算法時(shí),非常適合作為標(biāo)準(zhǔn)答案進(jìn)行驗(yàn)證。

在線計(jì)算:www.ip33.com/crc.html

離線計(jì)算工具:CRC_Calc v0.1.exe或者GCRC.exe

格西CRC計(jì)算器:

總結(jié)

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

參考資料

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

segmentfault.com/a/1190000018094567

責(zé)任編輯:xj

原文標(biāo)題:CRC校驗(yàn)?zāi)銜幔坑?jì)算、校驗(yàn)、C語言實(shí)現(xiàn),三步教你輕松搞定

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

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

    關(guān)注

    180

    文章

    7608

    瀏覽量

    137119
  • CRC校驗(yàn)
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    15233

原文標(biāo)題:CRC校驗(yàn)?zāi)銜幔坑?jì)算、校驗(yàn)、C語言實(shí)現(xiàn),三步教你輕松搞定

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

收藏 人收藏

    評論

    相關(guān)推薦

    求助,關(guān)于ADS125H02數(shù)據(jù)通訊格式及CRC校驗(yàn)問題求解

    of the initial data. 第1條中,將所有數(shù)據(jù)“左移擴(kuò)展為40bit,最右邊用1補(bǔ)齊”,與傳統(tǒng)的crc計(jì)算方法不一致,傳統(tǒng)的計(jì)算方法是在
    發(fā)表于 12-03 06:54

    HPLC通信與云計(jì)算的結(jié)合 HPLC通信信號處理方法

    快速、準(zhǔn)確地傳輸大量數(shù)據(jù)。 云計(jì)算平臺具備強(qiáng)大的數(shù)據(jù)處理和分析能力,可以實(shí)時(shí)接收、處理和分析HPLC通信傳輸?shù)?b class='flag-5'>數(shù)據(jù)。 通過云
    的頭像 發(fā)表于 12-02 14:13 ?164次閱讀

    ADS131B04-Q1 SPI通信時(shí),為什么無法得到正常的CRC校驗(yàn)?

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

    使用MSP430 MCU實(shí)現(xiàn)CRC

    電子發(fā)燒友網(wǎng)站提供《使用MSP430 MCU實(shí)現(xiàn)CRC.pdf》資料免費(fèi)下載
    發(fā)表于 10-23 10:19 ?0次下載
    使用MSP430 MCU<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>CRC</b>

    TAS5805內(nèi)部的硬件CRC8對應(yīng)標(biāo)準(zhǔn)的哪種? CRC校驗(yàn)的數(shù)據(jù)是offset和value值嗎?

    TAS5805 內(nèi)部的硬件 CRC8 對應(yīng)標(biāo)準(zhǔn)的哪種? CRC 校驗(yàn)的數(shù)據(jù)是 offset 和 value 值嗎?用 PPC 加載文件計(jì)算出來的值和在線
    發(fā)表于 10-12 06:19

    CRC實(shí)施

    電子發(fā)燒友網(wǎng)站提供《CRC實(shí)施.pdf》資料免費(fèi)下載
    發(fā)表于 09-26 09:44 ?0次下載
    <b class='flag-5'>CRC</b>實(shí)施

    推動(dòng)智慧交通建設(shè),邊緣計(jì)算賦能交通信號燈數(shù)據(jù)處理與決策能力

    隨著智慧城市建設(shè)的快速發(fā)展,智慧交通已成為城市發(fā)展的重要組成項(xiàng)目。智慧交通旨在通過大數(shù)據(jù)、人工智能、物聯(lián)網(wǎng)等先進(jìn)技術(shù),實(shí)現(xiàn)交通系統(tǒng)的全面感知、智能分析、主動(dòng)服務(wù)和協(xié)同管理。邊緣計(jì)算在交通信
    的頭像 發(fā)表于 07-25 16:04 ?728次閱讀
    推動(dòng)智慧交通建設(shè),邊緣<b class='flag-5'>計(jì)算</b>賦能交<b class='flag-5'>通信</b>號燈<b class='flag-5'>數(shù)據(jù)</b>處理與決策能力

    如何計(jì)算BMHD中的逆CRC值?

    更新各自的 CRC 和反向 CRC 值。 * 使用 IEEE 802.3 標(biāo)準(zhǔn)中定義的 CRC-32 多項(xiàng)式生成 CRC 值。 CRC
    發(fā)表于 05-31 06:43

    使用C語言實(shí)現(xiàn)CRC計(jì)算單元的例子

    使用C語言實(shí)現(xiàn)CRC計(jì)算單元的例子
    的頭像 發(fā)表于 05-16 16:16 ?1023次閱讀

    CRC(循環(huán)冗余校驗(yàn))應(yīng)用舉例

    CRC(循環(huán)冗余校驗(yàn))應(yīng)用舉例
    的頭像 發(fā)表于 05-16 16:12 ?1307次閱讀

    這個(gè)CRC計(jì)算單元是如何基于固定的生成多項(xiàng)式(0x4C11DB7)來獲取給定數(shù)據(jù)緩沖區(qū)的CRC碼的?

    這個(gè)CRC計(jì)算單元是如何基于固定的生成多項(xiàng)式(0x4C11DB7)來獲取給定數(shù)據(jù)緩沖區(qū)的CRC碼的?
    的頭像 發(fā)表于 05-16 16:06 ?910次閱讀

    用STM32L05x的CRC模塊做modbus CRC16計(jì)算,結(jié)果不正確是為什么?

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

    新版CubeMX CRC校驗(yàn)?zāi)K沒有Config嗎?

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

    7系列FPGA中的POST_CRC錯(cuò)誤檢測與恢復(fù)策略

    FPGA 在比特流被加載時(shí)計(jì)算 CRC 值,然后該值與在比特流加載結(jié)束時(shí)預(yù)期的 CRC 值進(jìn)行比較。如果兩個(gè)值匹配,則FPGA 成功加載。
    發(fā)表于 02-28 14:58 ?903次閱讀
    7系列FPGA中的POST_<b class='flag-5'>CRC</b>錯(cuò)誤檢測與恢復(fù)策略

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

    瑞薩RA單片機(jī)硬件CRC計(jì)算單元采用固定的多項(xiàng)式發(fā)生器來計(jì)算8位或者32位數(shù)據(jù)CRC校驗(yàn)值,對數(shù)據(jù)
    發(fā)表于 02-26 11:45 ?1004次閱讀
    RA MCU中的<b class='flag-5'>CRC</b>模塊和使用方法
    主站蜘蛛池模板: 国产午夜免费一区二区三区| 午夜影视免费观看 | 国产精品大片天天看片| 激情五月在线| 91成人免费在线视频| 日韩一区二区视频| 久久久久久免费播放一级毛片| 亚洲欧美v视色一区二区| 欧美一区二区不卡视频| 2019天天操天天干天天透| 日日骑夜夜操| 黄色靠逼网站| 国产91啪| aaaa一级片| 四虎永久免费地址在线网站| 日本午夜大片a在线观看| 亚洲婷婷六月| 天堂bt资源www在线| 欧美一级特黄aaa大片| 韩国三级理在线视频观看| freesexvideo性欧美tv| 天天操天天拍| 亚洲伊人色一综合网| www.亚洲黄色| 人人干人人艹| 拍拍拍无档又黄又爽视频| yy4080午夜理论一级毛片| 97天天摸天天碰天天爽| 亚洲一一在线| 亚洲黄色官网| 中文字幕88页| 最新bt合集| 日日摸人人拍人人澡| 色香蕉在线| 欧洲freexxxx性| 丁香六月婷婷在线| 三级黄色免费网站| 国产h视频在线观看网站免费| 伊人精品网| 久久综合色区| 天堂网www中文天堂在线|