发送0xFF和用带符号字节计算CRC - WriteSingleCoil& ModBUS& Java& Android -

时间:2012-11-05 12:21:54

标签: java android outputstream crc modbus

已编辑& 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;
}

1 个答案:

答案 0 :(得分:1)

问题不是很清楚 - 但是,处理字节最常见的问题是Java没有无符号字节,布尔运算总是在int

之间

处理字节的最佳方法是使用整数,并使用0xff进行每个操作。还可以使用>>>右移(这是未签名的版本)

示例:

字节b =(字节)(255& 0xff)//为您提供“无符号字节”

字节b =(字节)((b <&lt; 2)0xff)//向左移位必须被截断

如果您发布代码来计算CRC,我可以查看它

在不使用负数的情况下定义字节数组的最佳方法是这样的:

byte[]={ (byte)0xff, (byte)0xff, (byte)0xff };