我想使用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);
}
}
< p> 我应该使用boost :: asio :: streambuf
吗?我如何从中提取数据以便解析消息?我还想知道是否需要有一个单独的线程仅调用此函数,使其更频繁地被调用。由于高流量和串行端口的缓冲区耗尽,我应该担心在两次调用函数之间丢失数据吗?我正在使用Qt的GUI库,我不知道处理所有事件需要多长时间。
编辑:有什么方法可以检查串行端口是否有任何传入数据?如果没有传入数据,我不希望函数被阻塞...
read
函数,而正确的函数应该是async_read
。同样的道理也适用于写入,应该使用async_write
来防止程序在读取时出现暂停而导致程序冻结。 - HelloGoodbye