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了哈!

 

posted @ 2021-12-22 17:47  摩尔迦娜  阅读(524)  评论(0)    收藏  举报