Я пытаюсь реализовать простой протокол последовательного порта.Это выглядит следующим образом:
0xff
0xff
, даже если не ожидается, например, в середине данных, это означает, что получен новый пакет Я могу реализовать это, используя boost :: asio :: serial_port
с boost :: asio :: read ()
, читающим один байт и обрабатывающим этот байт при его получении. Хотя это работает, мне было интересно, есть ли способ сделать это более «boost»?
Я смотрел boost :: asio :: read_until ()
для чтения до 0xff
, но тогда я не знаю, как отбросить данные. Хранение данных в буфере, а затем отказ от него кажется немного расточительным.
Я могу использовать boost :: asio :: read_until ()
для чтения до конца пакета, но тогда MatchCondition
должен иметь доступ к (заголовку пакета в) буфер. Кажется, что MatchCondition
получает итератор только для первого и последнего недавно полученных байтов.
Кроме того, данные, полученные с помощью boost :: asio :: read ()
, попадают в stream_buf
, и я должен проанализировать полученные данные в Packet
объект.Я могу выполнить этот анализ внутри Packet
, в отдельном объекте ParsePacket
или как-то интегрировать его с boost :: asio
(что-то вроде boost :: asio :: read (serial, myPacket);
где myPacket
- это объект Packet
)
Когда 0xff
встречается где угодно в полученных данных, это означает, что начинается новый пакет. Поэтому при получении 0xff
он должен забыть все предыдущие полученные данные и начать прием нового пакета.
Я планирую использовать асинхронные операции и добавить таймауты.
Итак, мой вопрос: где реализовать такой протокол? Или, в более общем смысле, где реализовать протокол с помощью boost :: asio
. Я ищу не рабочий код, а что-то вроде совета о том, где реализовать протокол и какие функции boost :: asio
использовать.
обновление:
В этом случае не используется управление потоком (аппаратное или программное).