Как правильно определить начало бинарного пакета, при чтении из последовательного порта
Имеется протокол, в котором пакет начинается с фиксированого маркера размером 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
Выглядит довольно громоздко, руки чешутся сразу читать по два байта сравнивать с маркером. Но, насколько это будет отказоустойчиво? Ведь последовательный порт оперирует байтами, а не пакетам, что если чтение начнется сразу со второго байта маркера? В таком случае весь цикл чтения будет "сдвинут" на один байт. Такое возможно?
Источник: Stack Overflow на русском