当前位置: 代码迷 >> 综合 >> java modbus crc16校验码 socket给发送的数据添加crc校验码
  详细解决方案

java modbus crc16校验码 socket给发送的数据添加crc校验码

热度:79   发布时间:2023-11-19 22:00:25.0

首先crc16校验码的生成的原理在上一篇博客里面已经说过了;

前提:xframe配置京金华服务器的端口号,绑定ip地址和端口号

程序要实现什么?

这个程序主要实现的是服务器发送数据到客户端,然后客户端发送数据到服务器端;

是一问一答的形式;

只有服务器发送,客户端才会应答

发送的形式:  数据+两位校验码

代码如下:

package cn.com.project;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Bus {	
public static void main(String[] args) {
try {
ServerSocket Server=new ServerSocket(6041);
StringBuilder ss=new StringBuilder();//建立连接
Socket socket=Server.accept();//发送数据//获取输出流
OutputStream out=socket.getOutputStream();
DataOutputStream data=new DataOutputStream(out);
byte[] bb={45,00,03,00,07};
int [] s=Test.getCrc(bb);
byte [] bs=new byte[7];
bs[0]=0x2D;
bs[1]=0x00;
bs[2]=0x03;
bs[3]=0x00;
bs[4]=0x07;
bs[5]=(byte) s[0];
bs[6]=(byte) s[1];
data.write(bs);
data.flush();
//接受数据InputStream in=socket.getInputStream();byte[] by=new byte[1024];byte[] buf=new byte[1024];int len=in.read(by);if(len>0){for (int i = 0; i < len; i++) {System.out.println("我尽量了");int v=by[i] & 0xFF;String hv=Integer.toHexString(v);if(hv.length()<2){ss.append(0);}ss.append(hv);}System.out.println(ss.toString());}
} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();
}	
}}

 

校验添加校验码的程序如下:

package cn.com.project;
public class Test {public static int [] getCrc(byte[] data) {int flag;// 16位寄存器,所有数位均为1int wcrc = 0xffff;for (int i = 0; i < data.length; i++) {// 16 位寄存器的低位字节// 取被校验串的一个字节与 16 位寄存器的高位字节进行“异或”运算wcrc = wcrc ^ data[i];for (int j = 0; j < 8; j++) {flag = wcrc & 0x0001;// 把这个 16 寄存器向右移一位wcrc = wcrc >> 1;// 若向右(标记位)移出的数位是 1,则生成多项式 1010 0000 0000 0001 和这个寄存器进行“异或”运算if (flag == 1)wcrc ^= 0xa001;}}//获取低八位int low=wcrc>>8;//或者wcrc/256int up=wcrc%256;//获取高八位int [] crc={up,low};return crc;/*	return Integer.toHexString(wcrc);*/
}
}

发送以后接受成功的数据如下:

用串口助手和程序接受的数据都一样;

注意:网上许多关于java的添加crc16校验码都有误导的!!

如下:许多网上程序都有    int height=wcrc>>8;16位寄存器取高八位与每个字节“异或”,是不对的!

应该是16位寄存器取低八位与每个字节“”异或”

 

  相关解决方案