2010-12-15 77 views
7

我正在嘗試向Motorola HCS08微控制器應用程序添加CRC16錯誤檢測。不過,我的校驗和不匹配。一個online CRC calculator提供了我在我的PC程序中看到的結果以及我在微觀上看到的結果。CRC16校驗和:HCS08 vs. Kermit與XMODEM

它將micro的結果稱爲「XModem」,並將PC的結果稱爲「Kermit」。

這兩個古老的協議指定使用CRC16的方式有什麼區別?

回答

17

您可以使用相同的基本代碼庫實現16位IBM,CCITT,XModem,Kermit和CCITT 1D0F。見http://www.acooke.org/cute/16bitCRCAl0.html其使用代碼從http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code

下表顯示它們的區別:

name polynomial initial val reverse byte? reverse result? swap result? 
CCITT   1021   ffff    no    no   no 
XModem  1021   0000    no    no   no 
Kermit  1021   0000   yes    yes   yes 
CCITT 1D0F 1021   1d0f    no    no   no 
IBM   8005   0000   yes    yes   no 

其中「反向字節」意味着每個字節是位反轉處理之前; '反向結果'意味着16位結果在處理後會被位反轉; '交換結果'意味着結果中的兩個字節在處理後交換。

以上所有內容均已通過與http://www.lammertbies.nl/comm/info/crc-calculation.html的測試向量驗證(如果這是錯誤的,我們都會丟失......)。

因此,在您的特殊情況下,您可以通過位反轉每個字節,反轉最終結果,然後交換結果中的兩個字節,將XModem的代碼轉換爲Kermit。

[我相信,但沒有檢查或計算出細節,扭轉每個字節相當於顛倒多項式(加上一些額外的細節)。這就是爲什麼你會在不同的地方看到非常不同的解釋,因爲基本上相同的算法。

此外,上述方法效率不高,但對測試有好處。如果你想有效的最好的事情是翻譯上面查找 - 表]

編輯我所說CCITT以上在RevEng catalogue記錄爲CCITT假。欲瞭解更多信息,請參閱上面鏈接的博客文章更新。

+0

優秀的研究成果! – Potatoswatter 2013-08-05 23:14:49

+0

在你的鏈接中,你提到能夠根據上面的信息生成查找表。如何做到這一點?另外,您使用短語「reverse」的方式與本文的使用方式之間是否存在任何關聯? http://www.danielvik.com/2010/10/calculating-reverse-crc.html他都是用查找表的方式來實現的,所以我很努力地看到有什麼區別/共同點。謝謝。 – NickHalden 2013-10-21 20:11:31

+0

@NickHalden NO - 那篇文章做的很奇怪,這很不可能是你想要的。它正在計算應該將什麼文本添加到某些內容中,以便CRC出現一定的值。 //你將使用上面的代碼通過重寫它來生成一個查找表,以便在一個循環中應用相同的邏輯值到0到25​​5,然後保存這些值並在稍後用來代替「內部循環」 crc算法。 – 2013-10-21 21:09:47

4

我的回憶(我以前是做調制解調器的東西的時候)是Kermit首先使用最低有效位處理數據的每個字節中的位。

大多數軟件CRC實現(Xmodem,可能)首先在數據字節中執行最高有效位。

當在庫源看(從http://www.lammertbies.nl/comm/software/index.html下載)用於您鏈接到CRC計算頁面,你會看到Xmodem協議使用CRC16-CCITT的多項式是:

x^16 + x^12 + x^5 + 1 /* the '^' character here represents exponentition, not xor */ 

多項式是通過位圖(注意,第16位是隱含的)

0x1021 == 0001 0000 0010 0001 binary 

的克米特實現使用表示:

0x8408 == 1000 0100 0000 1000 binary 

它與XModem的位圖相同,只是相反。

伴隨庫還提到了克米特以下區別的文本文件:

僅適用於CRC-克米特和CRC-SICK:所有輸入處理之後,CRC的一個補計算和CRC的兩個字節被交換。

所以應該很容易修改你的CRC例程來匹配PC結果。請注意,CRC庫中的源代碼似乎擁有相當寬鬆的許可證 - 可以按原樣使用它(至少適用於您的應用程序的部分)。

+0

這是它的90%。另外,查看該代碼,CCITT方法交換校驗和中的字節。如果代碼是C ...會更容易...實際上PC的程序在LabView中,所以看到校驗和算法的實際內容並不容易。解決方案是獲得另一個宣稱自己爲CCITT的CRC庫,並任意顛倒微型中的字節以匹配其結果。 – Potatoswatter 2010-12-15 23:52:14

+0

關於對CRC-Kermit和CRC-SICK執行補碼CRC的文本文件中的註釋看起來是「複印錯字」。在同一個文本文件中,上面有一個關於CRC-DNP的註釋,它討論了所需的補碼操作(它支持'複製錯字'理論)。對源代碼的檢查似乎證實補碼操作僅適用於CRC-DNP而不適用於CRC-Kermit和CRC-SICK。 – 2016-03-29 19:20:19