我已經開始使用Arduino,並且我爲自己設定的下一個任務是展現如何實施CRC校驗。我想我已經找到了一個體面的代碼。但只是實施......不,我想學習。我在一般的CRC上搜索了一下,我用YouTube視頻學習了數學基本原理和another site,它教會了我如何在C語言中實現CRC。特別是在閱讀本文之後,我的頭部有點過載,但我認爲我理解了這個原理。Arduino CRC32代碼說明搜索
所以,在我希望說服你我想學習這些東西之後,這裏給出了對我來說太複雜的Arduino CRC代碼片段的2nd link。
有幾件小事情在我腦海中產生問號,例如, 〜0L的含義是什麼,或者爲什麼在crc-strings函數的while循環中存在條件* s以及更多的事情。
有人可以通過第二個鏈接提供的代碼,並解釋它做了什麼詳細的,以便像我這樣的普通人也可以理解,而不僅僅是實現代碼?
我非常感謝。
問候
編輯:在評論要求我將張貼有關第二連桿的具體問題。
在crc_string函數中,變量crc被初始化爲〜0L。我知道〜是一個按位運算符,它使0到1反之亦然。但是它對0L有什麼作用?什麼是0L?另一個表達式爲NULL?爲什麼它以這樣一種抽象的方式寫成?有沒有更簡單的方法來編碼?
crc_string函數中的下一行:while(* s) - > * s在示例中爲「HELLO」。但是這是什麼意思?這不總是真的嗎?什麼時候可以變成假?我知道一些指針基礎知識,但我不明白這一點。
現在我們進入while表達式:crc_update(crc,* s ++); - >「HELLO」中的第二個參數是什麼,在這種情況下++會做什麼?我的意思是,你如何將HELLO增加1?
我想知道在這之後,其餘部分爲更清楚,但我可以用一些其他問題繼續下去了,
現在我們進入了更新功能:我真的沒有得到全部功能,爲什麼有一些轉換0 * 4(這不是無用的?),這是怎麼回事pgm_read_dword_near,爲什麼還有一些轉移,爲什麼在返回crc後,crc是〜再次?
在我編輯這篇文章之前的第一個鏈接中,您可以看到作者正在使用一個表來存儲crc的256位。在本教程中,有一個包含16個條目的表。我粗略地理解了爲什麼我們使用表格,並且由於arduino提供的空間有限,我認爲作者只使用了16個條目。但是,這是如何在這裏工作的?我真的不明白。
希望對於一開始就足夠具體。
另一個更通用的crc問題:我的意思是,crc的基本思想是將一個字節消息與另一個神祕數字分開,並將剩餘部分附加到消息中 - > crc是剩餘部分。但是當我有2個字節,例如我想同時傳送兩個字符,例如「H」和「W」?然後我必須crc的。我如何將這兩個crc轉換成最終的crc?
EDIT 2,因爲我想回答詹姆斯·鮑曼的答案:
首先,它是如此之大,我想問一個問題,只需1天之後,代碼的主人來了,答案是。
隨着你的指示已經幫助了我很多,我嘗試通過第一個字母「H」的示例經歷一個循環,直到我卡住了。
我認爲一些更多的問題會發生,我希望你也可以糾正我,如果我現在就告訴胡說:
2.1。首先,crc用0xFFFFFFFF初始化。
2.2。 「你好」就像一個陣列。指針在while循環中的作用是取消引用該數組的第一個地址,因此它是「H」。用參數:0xFFFFFFFF和「H」調用crc_update。在完成之後,指針將變爲「E」。
2.4。在更新函數中,tbl_idx被初始化爲0xFFFFFFFF^0x48(ASCII代碼爲「H」)。那麼它究竟是如何呢,因爲0x48只有1個字節?我將0x48轉換爲二進制,即:0100 1000.然後,在按位操作之後,它是:1011 0111.是正確的嗎?所以tbl_idx現在是1011 0111.
2.5。然後pgm搜索功能出現。在文檔中,我發現了一些令人困惑的關於「dword」的內容:「用16位(近)地址從程序空間讀取雙字。」但是在表格中,全是關於32位的?你能解釋我嗎?
2.6。我繼續這個功能。因此,它在表中搜索:1011 0111 & 0x0f這是0000 0111,然後^與crc >> 4(0000 1111 1111 1111 1111 1111 1111 1111 - 正確?)這是:很好的問題......不同的字節大小。 ..如果最右邊的字節被考慮,那麼結果將是:1111 1000,所以它在表中查找該值,但只有16個條目,而不是248 :(
我想我如果你能在這裏幫助我,那將是太仁慈了
如果你也有一個關於CRC32的好的和簡單的文檔,這對我來說也是可以理解的,不要毫不猶豫地分享它:-)
發佈某個問題。並且該鏈接代碼編譯時沒有錯誤。 – 2015-01-04 16:00:24
@TOMATO:我用一些更詳細的問題編輯了我的帖子。我知道代碼的作品。我想了解的是它是如何工作的。 – mathnow 2015-01-04 18:36:27
好多了!但仍然有太多問題,有些可以爲自己輕鬆回答。例如:谷歌「0L arduino」產生https://www.google.com/search?q=0L+arduino&btnG=Search&oe=utf-8&rls=org.mozilla%3Aen-US%3Aofficial&client=firefox-a&channel=sb - 而(* s)'也讓我感到厭倦 - 它關於通過內存地址指向的內容。這本身就是一個很好的問題 - 並且很容易讓人回答。當如此多的謹慎問題被包含進一個「問題」時,(尤其是當它們不像一般編程那麼多時),你不太可能得到答案。歡呼 – 2015-01-04 21:37:04