当前位置: 首页 > 知识库问答 >
问题:

发送0xFF并使用签名字节计算CRC-WriteSingleCoil&ModBUS&Java&Android-

吕修筠
2023-03-14

编辑和SOVLED(下图)

我正在使用Java for Android试图将字节255(在WriteSingleCoil函数中为0xff)发送到ModBUS服务器设备。

设备没有运行,我不知道是因为不能解释签名字节-1还是因为我计算CRC错误。我不知道如何计算负字节的CRC。

这个答案帮助了我。非常感谢秃鹰的一天

但我最大的问题是Java中带符号字节的常见问题。我的CRC计算函数对无符号字节做得很好,但如果我在有符号字节内部传递,它会出错。ModBUS comunication中使用字节的技巧是在整个应用程序中使用shorts作为字节,因为范围为0-255,甚至计算trames和CRC。只有在最后一步中,当将trame发送到ModBUS服务器时,才再次将它们强制转换为字节。这是跑步。

希望对将来的人有所帮助。

我想在地址1上设置线圈:

本十六进制:0A 05 00 01 ff 00 DC 81

此字节数组:10 5 0 1 255 0 220 129

所以:我不知道发送-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个答案

施博文
2023-03-14

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

处理字节的最好方法是使用整数,并使用0xff对每个操作进行-ing。也使用>>>为shift右侧(它是未签名的版本)

示例:

byte[]={ (byte)0xff, (byte)0xff, (byte)0xff };
 类似资料:
  • 因此,我的问题是:如何从整数结果到所需的双十六进制结果?我试了几个选择,都没有成功。 注意:我使用的是Qt,所以如果有人能找到实现QByteArray或其他Qt友好代码的解决方案,我会很高兴的。无论哪种方式,不使用Qt、C或C++的解决方案都是无用的:P

  • 我有字符串:。我需要计算这个字符串的CRC。 我有一个计算CRC的函数: 我想将一个字符串强制转换为ushort数组: 但是返回给我的是这样一个数组:。 请告诉我为了正确计算CRC我应该做些什么。

  • 我正在使用ModBus RTU,并试图找出如何计算CRC16。我不需要代码示例。我只是对机制很好奇。我已经了解到,基本的CRC是数据字的多项式除法,根据多项式的长度,用零填充。下面的测试示例应该检查我的基本理解是否正确: 数据字:01001011 多项式:1001(x3+1) 由于最高指数x3而被填充3位 计算:0100 1011 000/1001->余数:011 计算。 null 第二次尝试:由

  • 这给出了一个值-107。我对C还比较陌生,我还在做一些实验 谢谢你。

  • 我正试图从一个旧的串行设备反向工程通信协议。我已经搞清楚了大部分,但仍然停留在使用的CRC算法上。我有一个主机软件,我可以生成请求消息,所以我已经包括了一个由主机软件发送的相对较短的消息转储。 下面还有一些我还没有完全解码的数据字符串,前3个字符是从属地址(类似于modbus设备地址方案),接下来的2个字符是函数代码。“10”是一个数据缓冲区请求,我还没有解码。有趣的是,在这个特定的请求中有非数字

  • 我有一个通过RS232 COM与计算机通信的终端。我得到的协议说,我必须发送一定的字节组合和CRC 16 IBM计算的数据在最后发送 我还得到了一个C编写的应用程序,我可以用它来测试,该应用程序编写了一个带有发送数据和接收数据的日志。在该日志中,我查看是否向终端发送了以下字符串。我还必须发送数据06 35的这个CRC16 IBM结果。 我已经设法以某种方式将作为示例给出的C方法翻译成C#。但我的结