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群进行讨论。
C# 实现CRC16校验的更多相关文章
- 最详细易懂的CRC-16校验原理(附源程序)(转)
最详细易懂的CRC-16校验原理(附源程序) from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CR ...
- 最详细易懂的CRC-16校验原理(附源程序)
from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码( ...
- CRC-16校验C#代码
[csharp] view plaincopyprint? using System; using System.Collections.Generic; using System.Text; usi ...
- PHP CRC16 校验码的算法怎么使用
PHP CRC16 校验码的算法如何使用最近用到CRC16, 我现在就是要把 010301180001 算出CRC16的校验码,通过其他工具,可以得到 校验码是 05F1 最后完整的代码就是 0103 ...
- CRC-16校验原理
最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码(CRC码): 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. 2.生成CRC码的基本原理: 任意一 ...
- C# CRC16校验码 1.0
/// <summary> /// 计算CRC16校验码 1.0 /// </summary> /// <param name="bytes"&g ...
- 基于Modbus三种CRC16校验方法的性能对比
目录 1.背景介绍 2. CRC校验的三种方法 2.1. 直接计算CRC校验 2.2. 查短表法计算CRC16校验 2.3.查大表法计算CRC16校验 3.三种校验方式的测试方法 3.1.直接计算CR ...
- 查表法计算CRC16校验值
CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...
- Delphi CRC16校验算法实现(转)
循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利用除法及余数的原理来作错误侦测(Error Detecting)的.实际应用时,发送装置计算出CRC值并随 ...
随机推荐
- SolrJ的入门
什么是SolrJ? solrj是访问solr服务的java客户端,提供索引和搜索的请求方法, SolrJ和图形界面操作的区别就类似于数据库中使用jdbc和mysql客户端的区别一样. 我在测试Solr ...
- Got error -1 when reading table
环境:Percona Server for MySQL 5.5.18 模拟三个Terminal,实现当引用锁定表的查询被杀死时,错误日志中出现的Got error -1 when reading ta ...
- 算法(第四版)C# 习题题解——1.1
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 善用 Ctrl + F 查找题 ...
- zabbix/自动发现规则
对于zabbix 我们并不陌生 他是开源的监控系统,现在的一部分企业都在用zabbix,今天给大家分享的是企业级监控zabbix的自动发现规则,有了它我们自定义健康的时候根据宏值可以让他自动发现对 ...
- Day 10733 使用独立安装包安装.Net Framework 4.6.2时,提示『无法建立到信任根颁发机构的证书链』
出现该问题的原因是未能更新本机的受信任证书颁发机构证书列表,导致安装包验证失败,以下几种情况可以造成此问题: 1.安装该运行库的系统未接入互联网: 2.安装该运行库的系统所在的网络环境,屏蔽了对微软受 ...
- windows升级node
之前用的node版本太低,不兼容webpack4.x,需要升级,网上搜索了许多方法,发现在windows下行不通 找到的教程都说全局安装node下的一个名为n的模块,这个模块是node专门用于版本管理 ...
- IdentityServer4 错误解决方案
错误 解决方案 Grant types list cannot contain both xx and xx 以下授权类型不能同时存在: Implicit AuthorizationCode Impl ...
- VR外包团队—国内首家VR虚拟现实主题公园即将在北京推出
期,美国“The VOID”.澳洲“Zero Latency”两大虚拟现实主题乐园让许多爱好者兴奋至极,门票据说都已经预约到明年2月!在如此巨大的商机面前,谁将抢到国内VR虚拟现实主题公园第一块蛋糕? ...
- JxBrowser之三:常用函数setNetworkDelegate
1.常用函数setNetworkDelegate,包含对网络传输数据状态的多种监控回调. 2.着重说一下其中的几个函数 BrowserContext browserContext = BrowserC ...
- Practical Node.js (2018版) 第9章: 使用WebSocket建立实时程序,原生的WebSocket使用介绍,Socket.IO的基本使用介绍。
Real-Time Apps with WebSocket, Socket.IO, and DerbyJS 实时程序的使用变得越来越广泛,如传统的交易,游戏,社交,开发工具DevOps tools, ...