C# 實現CRC16校驗


前言


 本文將使用一個NuGet公開的組件技術來實現CRC16校驗功能,提供了一些簡單的API,來方便的實現。

 

在Visual Studio 中的NuGet管理器中可以下載安裝,也可以直接在NuGet控制台輸入下面的指令安裝:

Install-Package HslCommunication

NuGet安裝教程  http://www.cnblogs.com/dathlin/p/7705014.html

聯系作者及加群方式(激活碼在群里發放):http://www.hslcommunication.cn/Cooperation

 

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群進行討論。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM