chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

Q4MP_gh_c472c21 ? 來源:嵌入式ARM ? 作者:嵌入式ARM ? 2020-09-29 14:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

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

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

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

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

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

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

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

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

CRC算法簡介

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

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

CRC參數(shù)模型

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

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

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

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

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

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

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

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

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

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

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

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

美信(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計算模塊使用的是CRC-32模型

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

CRC計算

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

問:原始數(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ù),這樣計算條件才算完整,下面來實際計算:

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

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

驗證手算結(jié)果:

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

CRC校驗

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

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

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

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

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

CRC計算的C語言實現(xiàn)

無論是用C還是其他語言,實現(xiàn)方法網(wǎng)上很多,這里我找了一個基于C語言的CRC計算庫,里面包含了常用的21個CRC參數(shù)模型計算函數(shù),可以直接使用,只有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; }

計算結(jié)果:

CRC計算工具

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

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

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

格西CRC計算器:

總結(jié)

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

參考資料

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

segmentfault.com/a/1190000018094567

責(zé)任編輯:xj

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

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

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

    關(guān)注

    183

    文章

    7643

    瀏覽量

    145237
  • CRC校驗
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    15887

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    crc校驗不過,可能有哪些情況?

    crc校驗不一致,導(dǎo)致通信失敗 這個該怎么排查
    發(fā)表于 02-02 07:43

    一文解讀CRC校驗

    校驗的過程是什么? 發(fā)送方根據(jù)發(fā)送報文,計算CRC值。將原始信息和該CRC值一起發(fā)送給接收方。接收方根據(jù)原始信息,按照同樣的算法,計算CRC
    發(fā)表于 01-26 07:20

    STM32中SPI模塊的CRC功能

    CRC原理 SPI CRC針對8-bit和16-bit的數(shù)據(jù)格式,支持CRC8和CRC16計算
    發(fā)表于 01-15 23:21

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

    1 概述 循環(huán)冗余校驗(CRC) 主要應(yīng)用于核實數(shù)據(jù)傳輸或數(shù)據(jù)存儲的正確性和完整性。CW32R030 內(nèi)部集成CRC 計算單元, 支持采用多
    發(fā)表于 01-12 06:07

    芯源的CRC硬件計算誰用過嗎?MCU的CRC你們喜歡用硬件的還是軟件的???

    芯源的CRC硬件計算誰用過嗎?MCU的CRC你們喜歡用硬件的還是軟件的啊?
    發(fā)表于 12-01 08:25

    AS32系列MCU芯片中CRC計算模塊的應(yīng)用介紹

    、執(zhí)行器動作異常甚至整個控制系統(tǒng)宕機。循環(huán)冗余校驗(CRC)作為一種高效的錯誤檢測技術(shù),如同數(shù)據(jù)傳輸與存儲過程中的"安全校驗屏障",持續(xù)保障MCU與外部設(shè)備交互數(shù)據(jù)的準(zhǔn)確性。本文將系統(tǒng)闡述國科安芯推出的AS32系列MCU芯片中的
    的頭像 發(fā)表于 11-21 15:20 ?1297次閱讀
    AS32系列MCU芯片中<b class='flag-5'>CRC</b><b class='flag-5'>計算</b>模塊的應(yīng)用介紹

    硬件循環(huán)冗余校驗(CRC)模塊介紹

    CRC是一種錯誤檢測碼,用于檢測數(shù)據(jù)傳輸或存儲中的意外更改。它通過對數(shù)據(jù)應(yīng)用特定的算法生成一個固定長度的校驗值。這個校驗值附加在數(shù)據(jù)后面,接收方可以重新
    發(fā)表于 11-21 07:39

    CRC校驗的原理和應(yīng)用

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

    CRC校驗的本質(zhì)和物理意義

    工業(yè)控制系統(tǒng)中,Modbus RTU協(xié)議的CRC校驗如同通信網(wǎng)絡(luò)的\"免疫系統(tǒng)\",某石化廠DCS系統(tǒng)曾因CRC計算錯誤導(dǎo)致0.3%的數(shù)據(jù)
    發(fā)表于 11-13 07:58

    8種常用的CRC算法分享

    CRC 計算單元可按所選擇的算法和參數(shù)配置來生成數(shù)據(jù)流的 CRC 碼。有些應(yīng)用中,可利用 CRC 技術(shù)來驗證
    發(fā)表于 11-13 07:25

    RVMCU課堂「19」: 手把手教你玩轉(zhuǎn)RVSTAR—CRC計算

    在之前的內(nèi)容里,我們介紹了很多通信協(xié)議,不過僅講解了數(shù)據(jù)的收發(fā)方法,而在實際的通信系統(tǒng)中,除了要實現(xiàn)收發(fā)外,還要盡量保證數(shù)據(jù)盡量不出差錯。為
    發(fā)表于 10-30 07:49

    第十八章 淺談循環(huán)冗余校驗(CRC)計算單元

    本篇文章介紹了CRC(循環(huán)冗余校驗),其計算單元用 CRC-32多項式,32位數(shù)據(jù)寄存器,4個AHB時鐘周期完成計算。含
    的頭像 發(fā)表于 05-29 11:00 ?1193次閱讀
    第十八章 淺談循環(huán)冗余校驗(<b class='flag-5'>CRC</b>)<b class='flag-5'>計算</b>單元

    并行CRC實現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《并行CRC實現(xiàn).pdf》資料免費下載
    發(fā)表于 05-20 17:26 ?0次下載

    求助,關(guān)于ad7616序列器模式+crc的兩個問題求解

    是對的嗎?并且這個crc我用所有數(shù)據(jù)代入得不到這個值。這個crc值應(yīng)該怎么計算?軟件序列器模式和硬件序列器模式都是一樣的現(xiàn)象。有人能幫我解答嗎?感謝支持!
    發(fā)表于 04-15 08:23

    基于Verilog語言實現(xiàn)CRC校驗

    CRC即循環(huán)冗余校驗碼:是數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯功能,對
    的頭像 發(fā)表于 03-24 10:36 ?2434次閱讀
    基于Verilog語言<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>CRC</b>校驗