Где реализовать протокол с помощью boost :: asio?

Я пытаюсь реализовать простой протокол последовательного порта.Это выглядит следующим образом:

  1. отбросить все данные, пока не будет получено 0xff
  2. чтение заголовка (адрес узла и длина данных, 4 байта)
  3. чтение данных (макс. 64 байта)
  4. read crc
  5. обрабатывает полученный пакет
  6. отправляет ответ
  7. , когда отображается 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 использовать.

обновление:

В этом случае не используется управление потоком (аппаратное или программное).

8
задан rve 18 November 2011 в 10:50
поделиться