从python bytes-str生成4个字节的校验和

时间:2019-04-04 21:08:04

标签: python-3.x checksum uart

我正在与设备建立uart通信,但是我不知道如何生成验证我发送的数据所需的四个字节的校验和。在仪器手册中说校验和是“一个32位无符号值,它将数据头和数据有效载荷中的所有字节加起来。校验和溢出被截断”。

除其他外,我尝试将所有数据字节数组求和,然后将其转换为字节。但是无论我尝试什么,从设备获得的所有响应都是错误消息。我认为这是由于错误的校验和。 我正在尝试使用下面的函数来连接所有需要的字节。我使用pyserial库发送数据。

def empacota(flags, sequence, command, data):
    cksumMsg = b""
    uart_header = b"\x41\x42\x43\x44"
    uart_end = b"\x44\x43\x42\x41"
    data_len = bytes(len(data) + 2)
    cksumMsg += flags + sequence + data_len + command + data
    cksumMsg_array = bytearray(cksumMsg)
    checksum_int = sum(cksumMsg_array)
    checksum = checksum_int.to_bytes(5, "little")
    package_data = uart_header + checksum + cksumMsg + uart_end
    return(package_data)

1 个答案:

答案 0 :(得分:0)

对二进制文件和按位运算符进行了一些研究后,我可以继续进行交流。这是生成我的包裹数据的工作功能。

def empacota(flags, sequence, command, data):
    cksumMsg = b''
    UARTHeader = b"\x41\x42\x43\x44"
    UARTTrailer = b"\x44\x43\x42\x41"
    data_len = len(data) + 2
    cksumMsg += bytes(flags + sequence) + data_len.to_bytes(2, 
    byteorder='little') + bytes(command + data)
    checksum_int = (sum(cksumMsg))
    checksum = checksum_int.to_bytes(4, "little")
    package_data = UARTHeader + checksum + cksumMsg + UARTTrailer
    return(package_data)

有关更多信息: https://wiki.python.org/moin/BitwiseOperators