【问题标题】:Sending 0xFF and Calculating CRC with signed bytes - WriteSingleCoil & ModBUS & Java & Android -发送 0xFF 并使用有符号字节计算 CRC - WriteSingleCoil & ModBUS & Java & Android -
【发布时间】: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


    【解决方案1】:

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

    处理字节的最佳方式是使用整数,并且使用 0xff 进行每个操作。也使用 >>> 右移(它是无符号版本)

    例子:

    byte b= (byte)(255 & 0xff) // 给你“无符号字节”

    byte b= (byte) ((b

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

    不使用负数来定义字节数组的最好方法是这样的:

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

    【讨论】:

    • 嗨。非常感谢您的帮助。很抱歉不是很清楚,我会尽量详细解释。我已经编辑了帖子以提供更多信息。
    • iIndex = ucCRCLo ^ b:这样的操作必须写成 iIndex = (ucCRCLo ^ b)&0xff 因为 & 会将 ucCRCLo, b 和结果转换为 int,它是 32 位,而 short 是16 所以你会有很多额外的位设置为 1
    • 好的!再次感谢您的帮助。 CRC计算功能正在运行,但我仍然无法与ModBUS服务器通信。但我认为问题出在服务器内部,无法管理有符号字节。所以我会寻找一种替代设置值的方法。非常感谢。
    • 嗨,伙计!我已经解决了我的愚蠢问题。这是 Java 中带符号字节的常见问题。我的 CRC 计算函数对无符号字节是正确的,但如果我在有符号字节内传递它会出错。使用字节进行 ModBUS 通信的技巧是在整个应用程序中使用短字节作为字节,范围为 0-255,甚至计算电车和 CRC。并且仅在最后一步中,将 Trame 发送到 ModBUS 服务器时,再次将它们转换为字节。这正在运行。非常感谢您的帮助,它真的很有用;谢谢。
    • 不客气!我能理解这有多令人沮丧——我使用 Java 与大量低级设备进行交互并掌握了窍门!
    猜你喜欢
    • 2014-03-06
    • 2019-09-27
    • 2023-03-15
    • 2013-07-17
    • 2021-03-22
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多