2018年1月22日 星期一

DS18B20-認識CRC(3)

 CRC主題從開始到此篇已進入第三篇,其中有CRC基礎及簡化CRC的詳細步驟,到上一篇將CRC-8的操作步驟規律整理至五步驟,那時,我以為這就是最終的簡化(其實也可以拿來寫程式了),但參考了其他程式庫,才知道還可以更精簡。整理如下!

精簡:提前位移,更好!

其實再簡化的步驟,就只是將向右位移的步驟提前至第二步驟,當計算值經XOR運算後為"0"時,位移值既為最終值,若為"1"時,直接與"10001100"進行XOR的運算既可。
說起來,向右位移的步驟往前,好像也沒什麼,但各位若細細品味,應可體會它對於程式的程序的精簡有不可小看的功效。


CRC-8的概念及程式碼

底下是概念圖及程式碼的整合,上面所說的精簡部份,可參考上一篇"[DS18B20-認識CRC(2)]"的概念圖,必須依初值X="1/0"的狀態與"0x80"與"0x18"進行XOR運算,而精簡後,則只要當初值X為"1"時,與"10001100"(0x8C)進行XOR運算既可,這樣對於程式設計的程序達到了極佳的精簡。

下一步,完整的程式碼!

當初在摸索CRC時,一開始也看不懂,先看CRC數學運算說明,有看沒有懂。再去看程式碼(如上圖),還是看不懂!後來,乾脆就用最笨的方法,進入位元值的角度,用填空格及移位的方式來摸索,這樣才漸漸懂得如何而來,再回頭看數學運算及程式碼,就懂了!

CRC用了三篇來說明,一是因為它扮演著單線數位傳輸的要角,必須懂。二是三篇的過程來說明,是詳細的呈現,我是用何種方法來學習CRC,這是我的「格物」之道!僅供參考!

常見CRC的處理方式還有使用查表法的方式,優點是速度快,但會佔較多的程式碼空間,但其基本仍是依上圖所示!

至此,我們算是完成了CRC的認識及關鍵程式碼的演化程序!

下一步,將並利用它來作參數的調整!







沒有留言:

張貼留言