Я хочу проверить наличие пакетов данных на последовательном порту, используя boost.asio
. Каждый пакет данных будет начинаться с заголовка длиной один байт и будет указывать, какой тип сообщения был отправлен. Каждый тип сообщения имеет свою длину. Функция, которую я хочу написать, должна непрерывно прослушивать новые входящие сообщения, а когда она находит одно, она должна читать его и вызывать какую-то другую функцию для ее анализа. Мой текущий код выглядит следующим образом:
void check_for_incoming_messages()
{
boost::asio::streambuf response;
boost::system::error_code error;
std::string s1, s2;
if (boost::asio::read(port, response, boost::asio::transfer_at_least(0), error)) {
s1 = streambuf_to_string(response);
int msg_code = s1[0];
if (msg_code < 0 || msg_code >= NUM_MESSAGES) {
// Handle error, invalid message header
}
if (boost::asio::read(port, response, boost::asio::transfer_at_least(message_lengths[msg_code]-s1.length()), error)) {
s2 = streambuf_to_string(response);
// Handle the content of s1 and s2
}
else if (error != boost::asio::error::eof) {
throw boost::system::system_error(error);
}
}
else if (error != boost::asio::error::eof) {
throw boost::system::system_error(error);
}
}
Является ли boost::asio::streambuf
правильным инструментом для использования? И как мне извлечь из него данные, чтобы я мог разобрать сообщение? Я также хочу знать, нужно ли мне иметь отдельный поток, который вызывает только эту функцию, чтобы он вызывался чаще. Стоит ли беспокоиться о потере данных между двумя вызовами функции из-за высокого трафика и исчерпания буфера последовательного порта? Я использую библиотеки Qt для графического интерфейса и не знаю, сколько времени нужно для обработки всех событий.
Редактировать: Интересный вопрос: как я могу проверить, есть ли какие-либо входящие данные на последовательном порту? Если нет входящих данных, я не хочу, чтобы функция блокировала ...