【问题标题】:Generating 4 bytes checksum from python bytes-str从 python bytes-str 生成 4 字节校验和
【发布时间】:2019-04-13 23:31:02
【问题描述】:

我正在设置与设备的 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)

【问题讨论】:

    标签: python-3.x checksum uart


    【解决方案1】:

    在学习了一些关于二进制和位运算符的知识后,我可以开始交流了。这是生成我的包数据的工作函数。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多