编辑&Sovled(下图)
我正在使用Java进行Android尝试将字节255(WritesingLecoil函数中的0xFF)发送到Modbus Server设备。
设备不是runnig,我不知道是因为无法解释签名的字节-1还是因为我错误地计算CRC。我不知道如何计算负字节的CRC。
总结:我不知道如何发送函数05写单线圈,从Java到Modbus Server的COIL上的0xff值。
。有人可以帮我吗?
解决方案:
" iindex = uccrclo ^ b:这样的操作必须写为iIndex =(uccrclo ^ b)& 0xff,因为&将施放uccrclo,b,结果为int,这是32位,而缩短为16,所以您将拥有很多 额外的位设置为1"
这个答案对我有帮助。非常感谢TheDayofCondor
,但我的巨大问题是在Java中带有签名字节的通常问题。我的CRC计算函数适合无符号字节,但是如果我传递在签名字节内,则会出现错误。用于Modbus共同处理的字节的工作诀窍是在整个应用程序中使用短裤,因为字节具有0-255的范围,甚至计算Trames和CRC。只有在最后一步,将曲线发送到modbus sever时,再次将其施放给字节。这正在运行。
希望将来对某人有帮助。
解释问题:
我试图用函数05设置线圈到modbus,这是对函数的解释:
请求
我正在尝试在地址1:
上设置线圈这个十六进制:0a 05 00 01 FF 00 DC 81
此字节阵列:10 5 0 1 255 0 220 129
10:从属地址(10 = 0a hex)
05:功能代码(强制单线圈)
0001:线圈的数据地址。(线圈#1 = 01 HEX)
ff00:写入状态(ff00 = on,0000 = off)
DC81:CRC(环状冗余检查)是否检查错误。
问题是Java使用签名字节,所以我不能将255放在我的字节数组上。我知道我应该放-1,但是我无法正确计算CRC,因为我有几个预先计算的字节来获取CRC,但是该函数发送了负索引。
so:我不知道我是否在尝试发送-1,如果我有发送255的替代方案,如何计算-1。
这是计算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没有Unsigned字节,而布尔操作始终在int
之间处理字节的最佳方法是使用整数,并使用0xFF进行每个操作。也将>>>用于右移动(这是无符号版本)
示例:
字节B =(字节)(255& 0xff)//给您"无签名字节"
字节b =(字节)((b<< 2)0xff)//左移位左右偏移
如果您发布代码以计算CRC,我可以查看它
在不使用负数的情况下定义字节数组的最佳方法就是这样:
byte[]={ (byte)0xff, (byte)0xff, (byte)0xff };