累加和校驗演算法在嵌入式中的應用

2021-10-20 18:13:52 字數 1518 閱讀 2077

因為外界總會對電路存在或多或少的干擾,對於數碼訊號,很可能導致傳輸的資料出現千差萬別。

對於很多需要傳輸資料的場合,尤其是一些資料可能會影響一些硬體的動作(諸如嵌入式的一些裝置、機械人等),錯誤的資料可能會帶來一些隱性風險,想想都可怕。

由於本人是嵌入式相關領域的,平時玩的都是微控制器,當然微控制器的效能千差萬別,不過很多的效能都只能說是勉強夠用,畢竟成本考慮。

所以今天的校驗演算法,比較簡單,但是有效,尤其是一些效能一般的硬體

傳送方:

對要資料累加,得到乙個資料和,對和求反,即得到我們的校驗值。然後把要發的資料和這個校驗值一起傳送給接收方。

接收方:

對接收的資料(包括校驗和)進行累加,然後加1,如果得到0,那麼說明資料沒有出現傳輸錯誤。

注意,此處傳送方和接收方用於儲存累加結果的型別一定要一致,否則加1就無法實現溢位從而無法得到0,校驗就會無效。

還是舉個例子:傳送方:要傳送0xa8,0x50,我們使用unsigned char(8位)來儲存累加和,即為0xf8(0b11111000),取反得到校驗和為0x07(0b00000111)。然後將這三個資料傳送出去。

接收方:如果接收正確,這三個資料的累加和就是(0b11111111),此時加1,則得到的結果為0(實際得到的應該是0b100000000,但是由於是使用unsigned char(8位)來儲存累加和,所以高位被擷取掉,只剩下了低八位的8個0).

由上面的例子,我們可以知道演算法的目的是:使累加和和校驗值相加得到乙個二進位制下每一位都是1的結果,這個結果很明顯很好處理,這種演算法實現起來也很簡單,下面給出c語言的**示例。

傳送方:以下是如何得到校驗值的**,結果就是我們想要的校驗值。

u8 tx_checksum(u8 *buf, u8 len) //buf為陣列,len為陣列長度

ret = ~ret;

return ret;

}

接收方:輸入已包含傳送發發來的校驗值,如果函式返回的值如果是0,說明資料正確。

u8 rx_checksum(u8 *buf, u8 len) //buf為陣列,len為陣列長度

ret = ret;

return ret+1;

}

1.據說很多搞軟體的羨慕硬體工程師

2.微控制器常用的幾種通訊介面,i2c、spi、uart等

3.程式語言1月排行榜結果出爐,我們有五個重要發現

4.5元變70,哎,晶元又缺貨了

5.risc-v處理器是如何設計指令集的?有何特別之處

6.嵌入式工程師常用的巨集定義

嵌入式微控制器上的CRC計算和校驗程式1

注意 此程式計算出的crc值,和電腦版crc計算工具計算出的值不一樣。c程式如下 crc16 ibm standard,polygon code 0x8005 const uint16 crc tab16 crc32 common standard,polygon code 0x04c11db7 c...

嵌入式系統在物聯網行業中的應用

作為物聯網重要技術組成的嵌入式系統,嵌入式系統的視角有助於深刻地 全面地理解物聯網的本質。作為物聯網重要技術組成的嵌入式系統,嵌入式系統的視角有助於深刻地 全面地理解物聯網的本質。嵌入式系統技術 是綜合了計算機軟硬體 感測器技術 積體電路技術 電子應用技術為一體的複雜技術。經過幾十年的演變,以嵌入式...

VMWare 在嵌入式Linux開發的應用

1.vmware 簡介 1.1 什麼是vmware.vmware是比較流行的虛擬軟體,它可以在windows上模擬一台虛擬機器,安裝任何基於x86的作業系統.它也有linux版本,這樣可以在linux安裝windows 更新的伺服器版vmware esx已經不需要作業系統了.直在一台硬體上虛擬出n個...