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校验内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论