前言


本文将使用一个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. 02:openf-falcon安装

    open-falcon其他篇 目录: 1.1 安装open-falcon环境准备 1.2 部署open-falcon后端 1.2.1 agent配置文件 1.2.2 transfer(数据上报) 1. ...

  2. P3346 [ZJOI2015]诸神眷顾的幻想乡

    思路 注意到叶子节点(度数为1)只有20个,可以分别以这20个节点为根,把所有子串插入SAM中,统计最后的本质不同的子串个数 所以就是广义SAM了 然后注意要判断一下有无重复插入 代码 #includ ...

  3. (转载)Unity3D开发之编辑器统一修改Text字体

    最近遇到一个需求,就是我们在做完一个场景后,美工感觉字体不好看,效果不是很好,想要换一种字体.UGUI的界面已经搭完,如果要一个一个Text寻找,工作量将是巨大.而且作为程序人员是不会容忍自己做这些机 ...

  4. Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 )

    refer : https://dotnetcoretutorials.com/2017/08/20/sending-email-net-core-2-0/ https://ppolyzos.com/ ...

  5. 在table表格中实现圆角效果

    在table中设置border-radius发现不起作用,网上查找了一番,原因是border-collapse:collapse和border-radius不兼容. 设计图效果 代码实现效果: < ...

  6. 『TensorFlow』梯度优化相关

    tf.trainable_variables可以得到整个模型中所有trainable=True的Variable,也是自由处理梯度的基础 基础梯度操作方法: tf.gradients 用来计算导数.该 ...

  7. Codeforces Round #349 (Div. 1)E. Forensic Examination

    题意:给一个初始串s,和m个模式串,q次查询每次问你第l到第r个模式串中包含\(s_l-s_r\)子串的最大数量是多少 题解:把初始串和模式串用分隔符间隔然后建sam,我们需要找到在sam中表示\(s ...

  8. 封装一个使用cURL以POST方式请求https协议的公众方法

    打开php7.2手册,搜索curl function getRequest($url,$type='get', $data = [], $timeout = 10) (需要更改){ $ssl = st ...

  9. OSSIM安装使用教程(OSSIM-5.6.5)

    一.说明 1.1 相关概念说明 SEM,security event management,安全事件管理,指对事件进行实时监控,收集信息差展生通知和告警的行为. SIM,security inform ...

  10. Python Flask框架

    Python有很多Web框架,可谓是百家争鸣,我这里列出几个比较叼的几个框架 Django      市场占有率最高,官方文档几近完美,但是适合比较大的项目,小项目会显得累赘. Tornado    ...