gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:31:14 26 4
gpt4 key购买 nike

我编写了一些简单的代码来从计时器的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com