累加和校驗算法(CheckSum算法)


摘自:https://blog.csdn.net/m0_37697335/article/details/83867199

因為外界總會對電路存在或多或少的干擾,對於數字信號,很可能導致傳輸的數據出現千差萬別。對於很多需要傳輸數據的場合,尤其是一些數據可能會影響一些硬件的動作(諸如嵌入式的一些設備、機器人等),錯誤的數據可能會帶來一些隱性風險,想想都可怕。

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

所以今天的校驗說法,比較簡單,但是有效,尤其是一些性能一般的硬件。

說道今日主角:累加和校驗算法,又名CheckSum算法。至於出處,這里就不考究了。

這種算法的實現:

發送方:對要數據累加,得到一個數據和,對和求反,即得到我們的校驗值。然后把要發的數據和這個校驗值一起發送給接收方。

接收方:對接收的數據(包括校驗和)進行累加,然后加1,如果得到0,那么說明數據沒有出現傳輸錯誤。(注意,此處發送方和接收方用於保存累加結果的類型一定要一致,否則加1就無法實現溢出從而無法得到0,校驗就會無效)

還是舉個例子:

發送方:要發送0xA8,0x50,我們使用unsigned char(8位)來保存累加和,即為0xF8(0b11111000),取反得到校驗和為0x07(0b00000111)。然后將這三個數據發送出去。

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

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

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

 1 uint8_t TX_CheckSum(uint8_t *buf, uint8_t len) //buf為數組,len為數組長度
 2 {
 3 uint8_t i, ret = 0;
 4 
 5 for(i=0; i<len; i++)
 6 {
 7 ret += *(buf++);
 8 }
 9 ret = ~ret;
10 return ret;
11 }

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

 1 uint8_t RX_CheckSum(uint8_t *buf, uint8_t len) //buf為數組,len為數組長度
 2 {
 3 uint8_t i, ret = 0;
 4 
 5 for(i=0; i<len; i++)
 6 {
 7 ret += *(buf++);
 8 }
 9 ret = ret;
10 return ret+1;
11 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM