码迷,mamicode.com
首页 > Windows程序 > 详细

C# 实现CRC16校验

时间:2017-11-12 16:27:48      阅读:425      评论:0      收藏:0      [点我收藏+]

标签: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校验

标签:log   tar   text   crc校验   语言   时间   logs   href   代码生成   

原文地址:http://www.cnblogs.com/dathlin/p/7821808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!