tj_duan 2023-12-02 17:19 采纳率: 41.2%
浏览 20
已结题

Android串口开发 使用CRC16校验后返回的校验码不正确

CRC16Modbus计算时出现问题,目前需要传递的数据是01 03 00 00 00 10 正常设备接收值应该是01 03 00 00 00 10 44 06 后两位是解析的校验码 但是我计算后返回的是-59 -51 这是为什么?

  • 写回答

1条回答 默认 最新

  • 爱编程的鱼 2023-12-02 17:43
    关注

    CRC16Modbus 是一种常用的循环冗余校验算法,用于检测和校正数据传输中的错误。根据你提供的数据 "01 03 00 00 00 10",以下是一个 Python 示例代码,用于计算 CRC16Modbus 校验码:

    def calculate_crc(data):
        crc = 0xFFFF
        polynomial = 0xA001
    
        for byte in data:
            crc ^= byte
            for _ in range(8):
                if crc & 0x0001:
                    crc >>= 1
                    crc ^= polynomial
                else:
                    crc >>= 1
    
        return crc.to_bytes(2, byteorder='little')
    
    # 将数据转换为字节列表
    data = bytes.fromhex("01 03 00 00 00 10".replace(' ', ''))
    
    # 计算 CRC16Modbus 校验码
    crc = calculate_crc(data)
    
    # 将校验码转换为十六进制字符串
    crc_hex = ' '.join([f'{byte:02X}' for byte in crc])
    
    print("Calculated CRC16Modbus:", crc_hex)
    

    根据上述代码,使用提供的数据 "01 03 00 00 00 10" 进行计算后,返回的 CRC16Modbus 校验码应为 "44 06"。

    如果你计算的结果是 "-59 -51",可能是由于数据类型的问题。CRC16Modbus 校验码通常表示为无符号整数,而不是有符号整数。如果你的计算结果是有符号整数,可以将其转换为无符号整数或字节表示形式,以得到正确的校验码。

    请注意,CRC16Modbus 计算中的字节顺序可能因设备而异。你可能需要根据设备的要求调整字节顺序。此外,还要注意数据的字节顺序,尤其是在使用大端字节序(Big Endian)设备时,可能需要调整数据的字节顺序以匹配设备的要求。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月14日
  • 已采纳回答 12月6日
  • 创建了问题 12月2日