【发布时间】:2012-10-25 06:49:26
【问题描述】:
EDITED & SOVLED(下)
我正在使用 Java for Android 尝试将字节 255(WriteSingleCoil 函数中的 0xFF)发送到 ModBUS 服务器设备。
设备没有运行,我不知道是因为无法解释有符号字节 -1 还是因为我计算 CRC 错误。 我不知道如何计算负字节的 CRC。
总结:我不知道如何发送函数 05 Write Single Coil with 0xFF value for switch on the coil for from Java to ModBUS server.
谁能帮帮我?
解决方案:
" iIndex = ucCRCLo ^ b: 这样的操作必须写成 iIndex = (ucCRCLo ^ b)&0xff 因为 & 会将 ucCRCLo, b 和结果转换为 int,它是 32 位,而 short 是 16,所以你会有很多 额外的位设置为 1"
这个答案帮助了我。非常感谢TheDayOfcondor
但我最大的问题也是 Java 中带有符号字节的常见问题。我的 CRC 计算函数对无符号字节是正确的,但如果我在有符号字节内传递它会出错。 使用字节进行 ModBUS 通信的技巧是在整个应用程序中使用短字节作为字节,范围为 0-255,甚至计算电车和 CRC。并且仅在最后一步中,将 Trame 发送到 ModBUS 服务器时,再次将它们转换为字节。这正在运行。
希望将来对某人有所帮助。
解释问题:
我正在尝试使用功能 05 将线圈设置为 ModBUS,这是对功能的解释:
请求
我正在尝试在地址 1 上设置线圈:
这个十六进制:0A 05 00 01 ff 00 DC 81
这个字节数组:10 5 0 1 255 0 220 129
10:从地址(10 = 0A 十六进制)
05:功能代码(强制单线圈)
0001:线圈的数据地址。 (线圈#1 = 01 十六进制)
FF00:要写入的状态(FF00 = ON,0000 = OFF)
DC81:用于错误检查的 CRC(循环冗余校验)。
问题是 Java 使用有符号字节,所以我不能将 255 放在我的字节数组上。 我知道我应该输入 -1,但是我无法正确计算 CRC,因为我有几个预先计算的字节数组来获取 CRC,但函数发送一个负索引。
所以:我不知道我尝试发送 -1 是否正确,如果我有发送 255 的替代方法,也不知道如何计算 -1 的 CRC。
这是计算CRC的函数:
public short[] GenerateCRC (byte[] pMsg) {
short ucCRCHi = 0xFF;
short ucCRCLo = 0xFF;
int iIndex;
for (byte b : pMsg)
{
iIndex = ucCRCLo ^ b;
try {
ucCRCLo = (short)(ucCRCHi ^ aucCRCHi[ ( iIndex ) ]);
ucCRCHi = aucCRCLo[ ( iIndex ) ];
} catch (Exception e) {
Log.e(LOGTAG, "GenerateCRC: " + e.toString(), e);
e.printStackTrace();
}
}
short[]result= new short[2];
result0]= ucCRCHi;
result1]= ucCRCLo;
return result;
}
【问题讨论】:
标签: java android outputstream crc modbus