java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java ModbusCRC16校验

java实现ModbusCRC16校验的示例代码

作者:你走以后

本文介绍了使用Java实现ModbusCRC16校验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 目的

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

2. 什么是ModbusCRC16校验

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

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

3. 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校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文