当前位置: 代码网 > it编程>编程语言>Java > java实现ModbusCRC16校验的示例代码

java实现ModbusCRC16校验的示例代码

2024年11月25日 Java 我要评论
1. 目的电流数据采集器是rs485 modbus协议,想通过java实现串口数据的采集,因为涉及到串口通信的crc校验,所以需要通过java来实现对采集的电流值进行校验,确保每次读到的电流值都是正常

1. 目的

电流数据采集器是rs485 modbus协议,想通过java实现串口数据的采集,因为涉及到串口通信的crc校验,所以需要通过java来实现对采集的电流值进行校验,确保每次读到的电流值都是正常的。

2. 什么是modbuscrc16校验

modbus协议是一种串行通信协议,被广泛用于设备之间的通信。modbus协议可以支持多种电气接口和传输介质,包括但不限于rs-232、rs-422、rs-485、以太网(tcp/ip)等。

crc16校验是一种基于多项式的校验方法,其核心思想是将数据视为一个长的二进制数,通过特定的生成多项式来计算一个短的余数,这个余数就是crc校验码

3. crc16校验步骤

  • 初始化预置一个16位的寄存器为十六进制0xffff,称此寄存器为crc寄存器,多项式为0xa001。
  • 数据处理
    • 2.1 将第一个8位二进制数据(通信信息帧的第一个字节)与16位的crc寄存器的低8位相异或,把结果放于crc寄存器。
    • 2.2 把crc寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位。
    • 2.3 如果移出位为0,继续右移;如果移出位为1,将crc寄存器与多项式0xa001异或
    • 2.4 重复上述步骤,直到处理完8次(即一个字节的所有位
  • 重复处理重复步骤2,处理通信信息帧的下一个字节,直到所有字节处理完毕
  • 结果处理最终寄存器中的值即为crc16校验值

4. 代码实现

 public static byte[] crc_calculate(byte[] data){
        int polynomial = 0xa001;      // crc-16/ibm 生成多项式0xa001
        int initial_value = 0xffff;   // 初始值0xffff
        int crc = initial_value;
        for (byte b : data) {  //遍历所有的字节
            crc ^= (b & 0xff); 
            for (int i = 8; i != 0; i--) {
                if ((crc & 0x0001) != 0) {
                    crc >>= 1;
                    crc ^= polynomial;
                } else {
                    crc >>= 1;
                }
            }
        }
        list<byte> list = new arraylist<>();
        // modbus的低位在前
        list.add((byte) (crc & 0xff));     // 低位
        list.add((byte) (crc >> 8));       // 高位
        return list.toarray(new byte[0]);  // 转换为byte数组
    }
    //主函数
    public class main {
    public static void main(string[] args) {
    byte[] data = {0x01, 0x03, 0x00, 0x20, 0x00, 0x01};
    //byte[] data = {0x01, 0x03, 0x02, 0x27, 0x10}; 
        byte[] crc = crc_calculate(data);
        system.out.println("crc-16 modbus length: " + crc.length);
        system.out.println("crc-16 modbus1: " + string.format("%x", crc[0]));
        system.out.println("crc-16 modbus2: " + string.format("%x", crc[1]));
    }
}

5. 结果比对

在这里插入图片描述

运行的结果:

在这里插入图片描述

由结果可以看出,85 c0与实际一致。

在这里插入图片描述

运行的结果:

在这里插入图片描述

由结果可以看出,a2 78与实际一致。

到此这篇关于java实现modbuscrc16校验的示例代码的文章就介绍到这了,更多相关java modbuscrc16校验内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com