C# 实现CRC16校验

时间:2022-02-10 08:45:20

在Visual Studio 中的NuGet打点器中可以下载安置,也可以直接在NuGet控制台输入下面的指令安置:

Install-Package HslCommunication

NuGet安置教程 

技术撑持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); }

功效如下:

C# 实现CRC16校验

或者我们接收到一个数据,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); }

其功效如下:

C# 实现CRC16校验

那么查验的时候也需要供给一个多项式码,好比你接收到了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群进行讨论。