已编辑& SOVLED(下方)
我正在使用Java for Android尝试将字节255(WriteSingleCoil函数中的0xFF)发送到ModBUS服务器设备。
设备不是runnig,我不知道是因为无法解释带符号的字节-1还是因为我错误地计算了CRC。 我不知道如何计算负字节的CRC。
总结:我不知道如何发送函数05 Write Single Coil with 0xFF value for switch on the coil for from Java to ModBUS server。
有人可以帮我吗?
SOLUTION:
“iIndex = ucCRCLo ^ b:像这样的操作必须写成iIndex =(ucCRCLo ^ b)& 0xff因为&将ucCRCLo,b和结果转换为int,这是32位,而short是16,所以你将有很多 额外位设置为1“
这个答案对我有帮助。非常感谢TheDayOfcondor
但是我的巨大问题是Java中带有签名字节的常见问题。我的CRC计算功能正在对无符号字节做正确的操作,但是如果我在有符号字节内传递它会产生错误。 使用ModBUS通信的字节工作的技巧是在整个应用程序中使用short作为字节,因为范围为0-255,甚至计算trames和CRC。并且只有在最后一步,当将trame发送到ModBUS服务器时,再次将它们转换为字节。这正在运行。
希望将来对某人有所帮助。
解释问题:
我正在尝试使用功能05将线圈设置为ModBUS,这是对功能的解释:
请求
我正在尝试将地址1上的线圈设为ON:
此十六进制: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;
}
答案 0 :(得分:1)
问题不是很清楚 - 但是,处理字节最常见的问题是Java没有无符号字节,布尔运算总是在int
之间处理字节的最佳方法是使用整数,并使用0xff进行每个操作。还可以使用>>>右移(这是未签名的版本)
示例:
字节b =(字节)(255& 0xff)//为您提供“无符号字节”
字节b =(字节)((b <&lt; 2)0xff)//向左移位必须被截断
如果您发布代码来计算CRC,我可以查看它
在不使用负数的情况下定义字节数组的最佳方法是这样的:
byte[]={ (byte)0xff, (byte)0xff, (byte)0xff };