標籤:log tar text crc校正 語言 時間 logs href 代碼產生
前言
本文將使用一個NuGet公開的組件技術來實現CRC16校正功能,提供了一些簡單的API,來方便的實現。
在Visual Studio 中的NuGet管理器中可以下載安裝,也可以直接在NuGet控制台輸入下面的指令安裝:
Install-Package HslCommunication
NuGet安裝教程 http://www.cnblogs.com/dathlin/p/7705014.html
支援人員QQ群:592132877 (組件的版本更新細節也將第一時間在群裡發布)
Summary
在串口的通訊下傳輸資料,其資料完整性比較差,需要使用CRC校正來提升資料完整性,在此處提供一個相對通用的CRC校正器,本篇不是關於CRC原理的介紹,而是校正碼產生和檢驗工具,環境是C#語言。
關於CRC16校正還得說幾句,CRC校正分好多種,本組件目前僅支援CRC16校正,未來版本可能會支援更多校正,看需求。
整個CRC16校正簡單的說,就是對一串byte數組進行運算,產生2個位元組的標識,來標記這個資料的身份,接收端接收資料和身份標識,來驗證資料是不是正確的。很多人寫程式發現,網上搜的代碼產生的CRC16碼和裝置的資料校正對應不起來,那是因為多項式碼是不一樣的,而多項式碼就相當於一個密碼一樣的東西,這個值不一樣,最終產生的驗證碼就不一樣,所以你在讀取一個儀錶的資料並準備校正時,一定要查看手冊看看這個儀錶資料的多項式碼是多少,由於我之前做項目碰到的儀錶多項式碼是0xA001,所以組件中的CRC16校正方法的預設多項式碼就是0xA001,當然,你也可以指定自己的多項式碼
Reference
CRC組件所有的功能類都在 HslCommunication.Serial 命名空間,所以再使用之前先添加
using HslCommunication.Serial
How to Use
下面就舉個例子吧,比如你要發送的資料是0xFF,0XA0,然後產生最終的資料因為在後面追加2個CRC位元組,然後我們把它顯示出來
private void userButton1_Click(object sender, EventArgs e) { byte[] data = new byte[] { 0xFF, 0xA0 }; byte[] result = HslCommunication.Serial.SoftCRC16.CRC16(data); textBox1.AppendText(HslCommunication.BasicFramework.SoftBasic.ByteToHexString(result) + Environment.NewLine); }
結果如下:
或者我們接收到一個資料,FFA04038,然後你在處理資料前需要對它進行檢驗是不是正確的,代碼如下:
private void userButton2_Click(object sender, EventArgs e) { byte[] data = new byte[] { 0xFF, 0xA0 ,0x40, 0x38}; bool result = HslCommunication.Serial.SoftCRC16.CheckCRC16(data); textBox1.AppendText(result.ToString() + Environment.NewLine); }
結果就顯示為True。
上述的CRC16的校正功能的多項式碼為0xA001,僅僅適用於某些特殊的儀錶資料,如果你清楚自己的儀錶的CRC16的多項式碼,上述的方法都提供了一個重載的版本,允許手動輸入多項式碼。
比如你的多項式碼為0X8005,在擷取CRC校正的代碼如下:
private void userButton3_Click(object sender, EventArgs e) { byte[] data = new byte[] { 0xFF, 0xA0 }; byte[] result = HslCommunication.Serial.SoftCRC16.CRC16(data, 0x80, 0x05); textBox1.AppendText(HslCommunication.BasicFramework.SoftBasic.ByteToHexString(result) + Environment.NewLine); }
其結果如下:
那麼檢驗的時候也需要提供一個多項式碼,比如你接收到了FFA006ED的資料
private void userButton4_Click(object sender, EventArgs e) { byte[] data = new byte[] { 0xFF, 0xA0, 0x06, 0xED }; bool result = HslCommunication.Serial.SoftCRC16.CheckCRC16(data, 0x80, 0x05); textBox1.AppendText(result.ToString() + Environment.NewLine); }
那麼其結果也是True。
基本的使用方法已經講解完成,如有疑問,可以聯絡文章開始處的QQ群進行討論。
C# 實現CRC16校正