Генерация 4 байтов контрольной суммы из Python Bytes-Str - PullRequest
0 голосов
/ 05 апреля 2019

Я настраиваю связь 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 голосов
/ 13 апреля 2019

Изучив немного о двоичных и побитовых операторах, я смог начать общение.Вот рабочая функция, которая генерирует данные моего пакета.

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

...