发送0xFF并使用有符号字节计算CRC - WriteSingleCoil & ModBUS&Java & Android -



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

最新更新