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

CRC-16-modbus循环校验方法

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

该方法未修改前来自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 基础】05.组件化

这是 Vue3 + Vite + Pinia +TS + Element-Plus 实战系列文档。最近比较忙没什么时间写文章,争取早日把这个系列完结吧~生命周期和模板引用在本章之前,我们通过响应式 api 和声明式渲染,处理了 DOM 的更新,但光是这些,对于一些复杂的需要手动操作 DOM 的情况,...

vue项目-父页面数据变化使子页面更新的几种情况

当操作页面时候,特别是增删改操作之后,数据会有所改变,这个时候我们希望组件中的数据要和最新数据一致,就需要重新更新渲染。以下是针对几种不同情况下方式:一.子页面调用接口后重新渲染1.使用ref方式父组件中用ref=“xxx” 来声明子组件,然后通过在父组件值改变的地方来调用子组件中的方法this.$...

79.idea中git合并分支操作分享

文章目录前言1.fetch的操作2.合并最新代码到当前的开发分支3.解决冲突4.分支合并:5.完成代码合并总结前言git的操作在日产的工作中也非常重要,团队化的代码管理,每次如果代码被别人覆盖或者自己的代码不能提交到服务器那是灾难性的结果,本篇进行一篇分享来总结下idea中git的操作帮助java开...

Windows 下 Git 拉 Gitlab 代码

读者提问:『阿常你好,Windows 下 Git 拉 Gitlab 代码的操作步骤可以分享一下吗?』阿常回答:好的,总共分为五个步骤。一、Windows 下安装 Git官网下载链接:https://git-scm.com/download/winStandalone Installer(安装版)注意...

「Git迁移」三行命令迁移Git包含提交历史,分支,tag标签等信息

问题描述:公司需要将一个git远程服务器的全部已有项目迁移到一台新服务器的Gitlab中,其中需要包含全部的提交纪录,已有的全部分支与全部打tag标签,目前此工作已全部迁移完毕,特此记录一下操作步骤环境描述:1. 要迁移的远程Git:Gitblit2. 迁移目的Git:Gitlab3. 暂存代码的P...

虚幻引擎5.5发布

IT之家 11 月 13 日消息,虚幻引擎 5.5 现已发布。据介绍,新版本虚幻引擎在动画创作、虚拟制作和移动游戏开发方面取得进步;渲染、摄像机内视觉特效和开发人员迭代等领域的部分功能已可用于生产。IT之家整理部分功能亮点如下:动画Sequencer增强虚幻引擎的非线性动画编辑器 Sequencer...