java读取modbus协议数据
最近要做工控项目,需要把对面的数据展示出来,
对方提供了modbus协议的数据,需要做串口编程,从来没弄过,一脸懵逼。
找了一些jar包最后选定modbus4j,还是蛮简单的。
代码是从这个博客里面找的,写的挺全的
https://blog.csdn.net/yhj_911/article/details/107179440
然后最后获取数据的时候,因为对方给的数据是modsim32中浮点型(互转)的类型,
没有用 response.getShortData() 获取返回的数据,用的是 response.getData() 获取字节数组,
一个浮点数相当于2个寄存器,也就等于4个byte,先转16进制字符串,再转float的值就取出来了
/** * byte数组转float数组 * @param bytes * @return */ public float[] bytesToFloats(byte[] bytes){ float[] newFloat = new float[bytes.length/4]; for (int i = 0; i < bytes.length/4; i++) { byte[] tmpBytes = Arrays.copyOfRange(bytes, i * 4, i * 4 + 4); Float tmpFloat = hexToFloat(bytesToHex(tmpBytes)); newFloat[i] = tmpFloat; } return newFloat; } /** * 16进制字符串转float * @param hex * @return */ public Float hexToFloat(String hex){ return Float.intBitsToFloat( Integer.valueOf( hex, 16 ) ); } /** * byte转16进制字符串 * @param bytes * @return */ public String bytesToHex(byte[] bytes) { StringBuffer sb = new StringBuffer(); for(int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(bytes[i] & 0xFF); if(hex.length() < 2){ sb.append(0); } sb.append(hex); } return sb.toString(); }
网上有的说这种浮点数(互转)需要进行高低位转换,相当于一个16进制字符串如 A1 B1 C1 D1 要转成 C1 D1 A1 B1,但java里貌似不用,可能是语言不同吧。
主要是根据这两篇文章理解来的,也贴下
https://blog.csdn.net/Augusdi/article/details/6368536?utm_source=blogxgwz4
https://blog.csdn.net/huoyizu/article/details/49120651
研究了2天终于读出来值了,技术难点解决,剩下的就是小case了哈!

浙公网安备 33010602011771号