将十六进制值以前导零写入寄存器 [英] Write hexadecimal values into register with leading zeros

查看:191
本文介绍了将十六进制值以前导零写入寄存器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个字符串数组,其中包含 16个十六进制值.我需要将它们转换为字节以将其写入Modbus的设备寄存器(每个寄存器的大小为16位).我们有 8个寄存器,可以写入16个十六进制值.因此,我将它们转换为short,然后从short转换为byte,以便将其写入设备寄存器.

I have an string array which contains 16 hexadecimal values. I need to convert them into byte to write them at Modbus's device register(size of each register is 16-bit). We have 8 registers to write 16 hexadecimal values. So, I'm converting them into the short and from short to byte for write them at device's register.

这是我的代码-

        String[] advanceByte = { "00", "00", "00", "00", "07", "46", "46", "07", "01", "00", "02", "02", "02", "03", "00", "00"};
        short[] hexToShort = new short[16];
        for (int i = 0; i < 16; i++) {
            hexToShort[i] = Short.parseShort(advanceByte[i], 16);
        }
        //  Converting Integer to Byte
        byte[] byteData = new byte[16];
        for (int i = 0; i < advanceByte.length; i++) {
            byteData`[i] = (byte) hexToShort[i];
        }
        for (int i = 0; i < byteData.length - 1;) {
        byte[] byteArr1 = {(byte) byteData[i], (byte) byteData[i + 1]};
        try {
            trans = new ModbusSerialTransaction(serialConnection);
            SimpleRegister myregister;
            myregister = new SimpleRegister(byteArr1[0], byteArr1[1]);
            writeSingleRegisterRequest = new WriteSingleRegisterRequest();
            writeSingleRegisterRequest.setUnitID(slave_Address);
            writeSingleRegisterRequest.setHeadless();
            writeSingleRegisterRequest.setReference(ref2); //register number 
            myregister.setValue(byteArr1);
            Register[] register = {myregister};
            writeSingleRegisterRequest.setRegister(myregister);
            trans.setRequest(writeSingleRegisterRequest);
            trans.execute();
            i = i + 2;
            ref2++;
        } catch (com.ghgande.j2mod.modbus.ModbusException exception) {
            advancedStatus = false;
            System.out.println("Table 4x4 data Writing Exception");
            System.out.println("Exception Occured ----" + exception);
        }
        serialConnection.close();

    }
    

每当我通过 QModMaster 从寄存器读取写入的数据时,前导零都将丢失.

Whenever, I am reading the written data from the register through QModMaster , leading zeros are missing.

需要帮助来解决此问题.

Need help to solve this Issue.

当我从其他应用程序中读取它们时,这就是结果.在此结果中,前导零缺失. 这是预期的结果.

This is the result, when I read them from other application. In this result, leading zero are missing. This is the expected result.

推荐答案

我在您的代码中唯一看到的错误是转换.我认为您应该避免String to Short转换,尤其是在可以直接转换hex to byte的情况下. 您应该已经做了类似的事情-

The only wrong thing I can see in your code is conversion. I think you should have avoided the String to Short conversion especially when, you can directly convert hex to byte. You should have done it something like this -

String[] advanceByte = { "00", "00", "00", "00", "07", "46", "46", "07", "01", "00", "02", "02", "02", "03", "00", "00"};
    byte[] byteData = new byte[16];
    for (int i = 0; i < advanceByte.length; i++) {
        byteData[i] = Byte.parseByte(advanceByte[i],16);
    }
    for (int i = 0; i < byteData.length - 1;) {
    byte[] byteArr1 = {(byte) byteData[i], (byte) byteData[i + 1]};
    try {
        trans = new ModbusSerialTransaction(serialConnection);
        SimpleRegister myregister;
        myregister = new SimpleRegister(byteArr1[0], byteArr1[1]);
        writeSingleRegisterRequest = new WriteSingleRegisterRequest();
        writeSingleRegisterRequest.setUnitID(slave_Address);
        writeSingleRegisterRequest.setHeadless();
        writeSingleRegisterRequest.setReference(ref2); //register number 
        myregister.setValue(byteArr1);
        Register[] register = {myregister};
        writeSingleRegisterRequest.setRegister(myregister);
        trans.setRequest(writeSingleRegisterRequest);
        trans.execute();
        i = i + 2;
        ref2++;
    } catch (com.ghgande.j2mod.modbus.ModbusException exception) {
        advancedStatus = false;
        System.out.println("Table 4x4 data Writing Exception");
        System.out.println("Exception Occured ----" + exception);
    }
    serialConnection.close();

}

这篇关于将十六进制值以前导零写入寄存器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆