Как правильно определить начало бинарного пакета, при чтении из последовательного порта

Рейтинг: 0Ответов: 0Опубликовано: 19.02.2023

Имеется протокол, в котором пакет начинается с фиксированого маркера размером 2 байта (0x1010).

У меня вопрос, как правильно и лаконично определить начало пакета при чтении? Читать сразу по два байта и сравнивать с маркером, или же читать по одному байту в поисках верной последовательности? В данным момент у меня реализован второй вариант:

def _listen(self) -> None:
    try:
        while self._work:
            if self._connection.read(1)[0] == 0x10 and self._connection.read(1)[0] == 0x10:
                header = self._connection.read(3)
                payload = self._connection.read(header[1]-5)
                self._on_message_received(payload)
    except KeyboardInterrupt:
        sys.exit(0)
    except Exception as e:
        print (e)
        return

Выглядит довольно громоздко, руки чешутся сразу читать по два байта сравнивать с маркером. Но, насколько это будет отказоустойчиво? Ведь последовательный порт оперирует байтами, а не пакетам, что если чтение начнется сразу со второго байта маркера? В таком случае весь цикл чтения будет "сдвинут" на один байт. Такое возможно?

Ответы

Ответов пока нет.