前言


本文将使用一个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群进行讨论。

C# 实现CRC16校验的更多相关文章

  1. 最详细易懂的CRC-16校验原理(附源程序)(转)

    最详细易懂的CRC-16校验原理(附源程序) from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CR ...

  2. 最详细易懂的CRC-16校验原理(附源程序)

    from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码( ...

  3. CRC-16校验C#代码

    [csharp] view plaincopyprint? using System; using System.Collections.Generic; using System.Text; usi ...

  4. PHP CRC16 校验码的算法怎么使用

    PHP CRC16 校验码的算法如何使用最近用到CRC16, 我现在就是要把 010301180001 算出CRC16的校验码,通过其他工具,可以得到 校验码是 05F1 最后完整的代码就是 0103 ...

  5. CRC-16校验原理

    最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码(CRC码): 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. 2.生成CRC码的基本原理: 任意一 ...

  6. C# CRC16校验码 1.0

      /// <summary> /// 计算CRC16校验码 1.0 /// </summary> /// <param name="bytes"&g ...

  7. 基于Modbus三种CRC16校验方法的性能对比

    目录 1.背景介绍 2. CRC校验的三种方法 2.1. 直接计算CRC校验 2.2. 查短表法计算CRC16校验 2.3.查大表法计算CRC16校验 3.三种校验方式的测试方法 3.1.直接计算CR ...

  8. 查表法计算CRC16校验值

    CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...

  9. Delphi CRC16校验算法实现(转)

    循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利用除法及余数的原理来作错误侦测(Error Detecting)的.实际应用时,发送装置计算出CRC值并随 ...

随机推荐

  1. PHP 订单延时处理:延迟队列(未鉴定)

    PHP 订单延时处理:延迟队列: https://github.com/chenlinzhong/php-delayqueue

  2. detours express版本的使用

    原文最早发表于百度空间2012-03-21 一.编译lib 1)拷贝它的src文件夹和system.mak文件到VS的VCVARS32.BAT所在的目录下 2)在命令提示符中运行VCVARS32.BA ...

  3. Html table、thead、tr、th、td 标签

    Html table.thead.tr.th.td 标签 案例一 <!-- table 表格标签,配置表格使用.border="1" 添加表格框架 --> <ta ...

  4. 算法(第四版)C# 习题题解——1.1

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 善用 Ctrl + F 查找题 ...

  5. 剑指offer(8)跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 题目分析 题目很简单,稍微分析就知道这是斐波那契数列,所以可以动态规划来做 a.如果两种跳法,1阶 ...

  6. topcoder srm 580 div1

    problem1 link 最优选择一定是在$2n$个端点中选出两个. problem2 link 分开考虑每个区间.设所有区间的左端点的最大值为$lc$,所有区间的右端点的最小值为$rc$.对于某个 ...

  7. Oracle使用——oracle复制表

    复制表结构和数据 create table table_name_new as select * from table_name_old; 复制表结构 ; 复制表数据(全量插入数据) 两个表结构相同 ...

  8. Java(1)JDK安装

    1.安装JDK开发环境 下载网站:http://www.oracle.com/ 开始安装JDK: 修改安装目录如下: 确定之后,单击"下一步". 注:当提示安装JRE时,可以选择不 ...

  9. Hadoop之简单文件读写

    文件简单写操作: import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream ...

  10. 掌握闭包closure (含义及优缺点)

    个人认为闭包其实非常好理解,我们一起去认识什么是闭包. 在javascript脚本语言中,变量的作用域只有两种,一种是全局变量,一种是局部变量. 全局变量的函数可以在整个javascript脚本语言中 ...