zoukankan      html  css  js  c++  java
  • 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群进行讨论。

  • 相关阅读:
    [Go] 理解(*interface{})(nil) 赋值的变量是否为nil
    [Linux] 理解CPU缓存的伪共享问题
    [MySQL] 理解InnoDB并发高的原因
    [Go] 理解计算机负数的表示以及整数范围
    [Go]理解golang项目性能分析工具trace
    [Go]理解golang项目性能分析工具PProf
    [Go] 理解切片slice扩容
    [javascript]解决多个版本的jquery库或者$冲突
    [Linux] 理解Reactor 模型
    [Linux] 理解I/O多路复用
  • 原文地址:https://www.cnblogs.com/dathlin/p/7821808.html
Copyright © 2011-2022 走看看