java - 我试图通过 ModBus RTU 协议(protocol)从时间计数器 OVEN 获取数据,但得到的响应是垃圾

标签 java

我编写了一些简单的代码来从计时器的 2 个寄存器中获取信息。
我正在向 OVEN 发送下一个命令:

10 03 00 16 00 02 26 8E

并期望得到下一个响应(尝试使用 OpenSCADA 来做到这一点):

10 03 04 00 BF AE B9 77 04

但我得到的是这个:

10 03 04 00 41 52 47 77 04

除了数据 block 之外,一切都是正确的,甚至 CRC 都是相同的。 为什么会这样?

好吧,这是一个代码:

    public static void workFlow(byte[] comm) throws IOException{
        try {
            byte inp [] = new byte [9];
            s = createSocket(address,port);
            s.getOutputStream().write(comm);
            s.setSoTimeout(500);
            Thread.sleep(1000);
            s.getInputStream().read(inp);

            for (int i = 0; i < inp.length; i++) {
                int unsinged = Math.abs(inp[i]);
                System.out.print(" " + Integer.toHexString(unsinged));
            }
            System.out.println("");

            s.close();
        } catch (Exception e) {
                            System.out.println("init error: " + e.getMessage());
                if (e.getMessage().contains("Read timed out")) {
                    System.out.println("Connection lost. Attempting to reconnect");
                    s.close();
                }
        }
    }

最佳答案

为什么int unsinged = Math.abs(inp[i]);

似乎您知道您需要字节中的无符号整数,但这不是您正在做的; 您实际上只是获得了绝对值,这不是您想要的。

所以用这个代替:

for (int i = 0; i < inp.length; i++) {
    System.out.print(" " + Integer.toHexString(Byte.toUnsignedInt(inp[i])));
}

这将避免在转换为整数时用 ff 字节填充字节,并使十六进制字符串准确表示字节。

关于java - 我试图通过 ModBus RTU 协议(protocol)从时间计数器 OVEN 获取数据,但得到的响应是垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57510197/

相关文章:

java - 使用 leftPanel、topPanel 和 bottomPanel 设置 JFrame

Java 允许创建通用数组吗?

c# - Silverlight - 使用 JAVA 在运行时发送/接收数据

java - 是否可以在 Eclipse 中显示图像直方图

java - 如何使用排序键将 java.util.Properties 写入 XML?

java - 有Linux服务吗

java - 使用 apache commons cli 进行命令行解析

java - 如何自动初始化调用 InetAddress.getLocalHost() 的静态变量?

java - Weblogic 11g,在托管服务器上部署了ear,无法访问

java - 我在将可绘制资源 ID 从类型化数组添加到自定义 ArrayAdapter 时遇到问题。它们都以 "0"的形式出现