当前位置:首页 > 技术分析 > 正文内容

CRC-16-modbus循环校验方法

ruisui881个月前 (03-26)技术分析18

该方法未修改前来自AI问答,可是结果是小端序列,ModbusRtu协议是大端序列,因为在输出处我修改成了大端序列输出,再强调一下,西门子PLC中的存储方式也是大端序列,即高字节在前,低字节在后,按照人们熟知的方式存储数据。

以下是一个用于 Modbus 中 CRC-16 循环校验的方法,包含校验验证功能,输出结果为字节数组形式:

代码块:

 public static class Crc16Helper
 {
     private const ushort polynomial = 0xA001;
     private static ushort[] crcTable = new ushort[256];

     private void Crc16Helper()
     {
         for (int i = 0; i < 256; i++)
         {
             ushort crc = (ushort)i;
             for (int j = 0; j < 8 j if crc 1='= 1)' crc='(ushort)((crc'>> 1) ^ polynomial);
                 }
                 else
                 {
                     crc >>= 1;
                 }
             }
             crcTable[i] = crc;
         }
     }

     public static byte[] CalculateCrc(byte[] data)  //CRC-16计算方法
     {
         ushort crc = 0xFFFF;
         foreach (byte b in data)
         {
             crc = (ushort)((crc >> 8) ^ crcTable[(crc ^ b) & 0xFF]);
         }
        Byte[] result= new byte[] { (byte)(crc >> 8), (byte)crc };
         // 将CRC转换为大端序
         if (BitConverter.IsLittleEndian)
         {
         Array.Reverse(result); // 转换为大端序
         }
          return result;
     }

     public static bool VerifyCrc(byte[] data, byte[] receivedCrc)//验证校验结果是否正确
     {
         byte[] calculatedCrc = CalculateCrc(data);
         return calculatedCrc[0] == receivedCrc[0] && calculatedCrc[1] == receivedCrc[1];
     }
}

测试代码块:

static void Main()
{
    byte[] data = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x02 };

    // 计算CRC并输出为byte数组
    byte[] crcBytes = Crc16Helper.CalculateCrc(data);
    Console.WriteLine($"CRC: {crcBytes[0]},{crcBytes[1]}");

    // 校验CRC
    bool isValid = Crc16Helper.VerifyCrc(data, crcBytes);
    Console.WriteLine($"CRC校验结果: {isValid}");
}

输出结果是:

CRC: 196,11

CRC校验结果: True

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3047.html

标签: java crc校验
分享给朋友:

“CRC-16-modbus循环校验方法” 的相关文章

Vue3 如何实现父子组件传值?

在Vue 3中,要实现父子组件传值效果主要通过props和emit两种机制来实现,下面我们就来详细介绍一下这两种机制。父组件向子组件传值propsprops是Vue组件的一种机制,主要的作用就是实现从父组件向子组件传递数据值,在父组件上通过在子组件标签上定义属性来实现数据属性值的传递,在子组件中通过...

git的几种分支模式

编写代码,是软件开发交付过程的起点,发布上线,是开发工作完成的终点。代码分支模式贯穿了开发、集成和发布的整个过程,是工程师们最亲切的小伙伴。那如何根据自身的业务特点和团队规模来选择适合的分支模式呢?本文分享几种主流 Git 分支模式的流程及特点,并给出选择建议。分支的目的是隔离,但多一个分支也意味着...

面试被逼疯:聊聊Python Import System?

面试官一个小时逼疯面试者:聊聊Python Import System?对于每一位Python开发者来说,import这个关键字是再熟悉不过了,无论是我们引用官方库还是三方库,都可以通过import xxx的形式来导入。可能很多人认为这只是Python的一个最基础的常识之一,似乎没有可以扩展的点了,...

HTML5+眼球追踪?黑科技颠覆传统手机体验

今天,iH5工具推出一个新的神秘功能——眼动追踪,可以通过摄像头捕捉观众眼球活动!为了给大家具体演示该功能的使用,我做了一个案例,供大家参考。实际效果如下:案例比较简单,就是通过眼动功能获取视觉焦点位置,剔除用户看中的牌。现在,舞台的属性中多了一个“启用眼动”的选项,另外,还多了一个“启用摄像头”的...

vue v-html动态生成的html怎么加样式/事件

1、动态生成的html,样式不生效//html 布局 <view v-html="html"> {{html}} </view> //动态生成的元素 <view class="btngo" @tap="handleLink...

USB电池充电基础:应急指南

USB为便携设备供电与其串行通信功能一样,已经成为一种标准应用。如今,USB 供电已经扩展到电池充电、交流适配器及其它供电形式的应用。应用的普及带来的一个显著效果是便携设备的充电和供电可以互换插头和适配器。因此,相对于过去每种装置都采用专用适配器的架构相比,目前的解决方案允许采用多种电源进行充电。毋...