前言
因為外界總會對電路存在或多或少的干擾,對于數(shù)字信號,很可能導(dǎo)致傳輸?shù)臄?shù)據(jù)出現(xiàn)千差萬別。
對于很多需要傳輸數(shù)據(jù)的場合,尤其是一些數(shù)據(jù)可能會影響一些硬件的動作(諸如嵌入式的一些設(shè)備、機器人等),錯誤的數(shù)據(jù)可能會帶來一些隱性風(fēng)險,想想都可怕。
由于本人是嵌入式相關(guān)領(lǐng)域的,平時玩的都是單片機,當(dāng)然單片機的性能千差萬別,不過很多的性能都只能說是勉強夠用,畢竟成本考慮。
所以今天的校驗算法,比較簡單,但是有效,尤其是一些性能一般的硬件。
說道今日主角:累加和校驗算法,又名CheckSum算法。至于出處,這里就不考究了。
累加和校驗算法的實現(xiàn)
發(fā)送方:
對要數(shù)據(jù)累加,得到一個數(shù)據(jù)和,對和求反,即得到我們的校驗值。然后把要發(fā)的數(shù)據(jù)和這個校驗值一起發(fā)送給接收方。
接收方:
對接收的數(shù)據(jù)(包括校驗和)進行累加,然后加1,如果得到0,那么說明數(shù)據(jù)沒有出現(xiàn)傳輸錯誤。
注意,此處發(fā)送方和接收方用于保存累加結(jié)果的類型一定要一致,否則加1就無法實現(xiàn)溢出從而無法得到0,校驗就會無效。
還是舉個例子:
發(fā)送方:要發(fā)送0xA8,0x50,我們使用unsigned char(8位)來保存累加和,即為0xF8(0b11111000),取反得到校驗和為0x07(0b00000111)。然后將這三個數(shù)據(jù)發(fā)送出去。
接收方:如果接收正確,這三個數(shù)據(jù)的累加和就是(0b11111111),此時加1,則得到的結(jié)果為0(實際得到的應(yīng)該是0b100000000,但是由于是使用unsigned char(8位)來保存累加和,所以高位被截取掉,只剩下了低八位的8個0).
由上面的例子,我們可以知道算法的目的是:使累加和和校驗值相加得到一個二進制下每一位都是1的結(jié)果,這個結(jié)果很明顯很好處理,這種算法實現(xiàn)起來也很簡單,下面給出C語言的代碼示例。
發(fā)送方:以下是如何得到校驗值的代碼,結(jié)果就是我們想要的校驗值。
接收方:輸入已包含發(fā)送發(fā)發(fā)來的校驗值,如果函數(shù)返回的值如果是0,說明數(shù)據(jù)正確。
責(zé)任編輯:lq
-
嵌入式
+關(guān)注
關(guān)注
5045文章
18817瀏覽量
298489 -
累加
+關(guān)注
關(guān)注
0文章
6瀏覽量
6788 -
校驗算法
+關(guān)注
關(guān)注
0文章
5瀏覽量
6599
原文標(biāo)題:累加和校驗算法在嵌入式中的應(yīng)用~
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論