Как дождаться большого количества пакетов erminator pyserial

avatar
sal
8 августа 2021 в 16:48
26
1
0

Я отлаживаю пакеты, отправленные с устройства с помощью pyserial. Пакеты имеют определенный шаблон терминатора, чтобы различать пакеты данных. Шаблон представляет собой большое число (0x3423fe67). Я могу получать байты и объединять их по мере их поступления с кодом ниже.

ser = serial.Serial(
                    ports="/dev/ttyUSB0",
                    baudrate=115200,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE,
                    bytesize=serial.EIGHTBITS
)

y = b''
while True:
    bytes = ser.inWaiting()
    if bytes > 0:
        x = ser.read(bytes)
        y += binascii.hexify(x)
        print(y)

Я вижу шаблон, который ищу, но как мне получить пакет и терминатор, когда я увижу терминатор. Я попытался проиндексировать объект bytes, но он возвращает странные значения. Все, что получено до терминатора, является частью пакета.

Источник

Ответы (1)

avatar
Frank
9 августа 2021 в 19:16
0

Вот код, который собирает пакеты в список. Код можно использовать в качестве руководства.

serialData — это данные, которые будут получены через последовательный порт в качестве примера (т. е. ser.read(), который заменит часть for в цикле x:). Обратите внимание, что может быть получено произвольное количество байтов, а тестовая переменная n используется только для проверки алгоритма при произвольной длине входящих полученных символов.

Переменная term нуждалась в шестнадцатеричном преобразовании, чтобы соответствовать шестнадцатеричному преобразованию входящих данных.

    import binascii
    import re

    term = binascii.hexlify(b'\x34\x23\xfe\x67')
    serialData = b'packet0\x34\x23\xfe\x67packet1\x34\x23\xfe\x67'
    n = 5
    x = [serialData[i:i+n] for i in range(0, len(serialData), n)]

    y = b''
    packets = []
    for piece in x:
        y += binascii.hexlify(piece)
        for i in re.finditer(term, y):
            packets.append(y[:i.start()])
            y = y[i.end():]

    print('packets = ', packets)