Я пытаюсь реализовать простой протокол последовательного порта.Это выглядит так:
- сбросить все данные до получения
0xff
- чтение заголовка (адрес узла и длина данных, 4 байта)
- чтение данных (макс. 64 байта)
- чтение crc
- обработка принятого пакета
- отправка ответа
- при просмотре
0xff
, даже если не ожидается, как всередина данных, это означает, что новый пакет получен
Я могу реализовать это, используя boost::asio::serial_port
с boost::asio::read()
, считывающим один байт и обрабатывающим этот байт, когда он получен.Хотя это работает, мне было интересно, есть ли более продвинутый способ сделать это?
Я смотрел на 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
использовать.
update:
Нет управления потоком (аппаратное или программное обеспечение)используется в этом случае.