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群进行讨论。

 

posted @ 2017-11-12 15:47  dathlin  阅读(16170)  评论(1编辑  收藏  举报