如何有效地阻止asio读取,直到数据在串行设备上可用?

时间:2017-06-18 21:49:35

标签: serial-port boost-asio blocking polling

我想使用asio从串行设备读取并在字节可用时处理它们。

使用async_read_until时,由于文件结束(EOF)错误,大部分时间都会调用我的回调。因此,我需要退出回调并再次注册,直到数据可用。这导致繁忙的循环,我想阻止。类似的情况发生在read_until,它会立即以相同的EOF错误返回。

对于POSIX,poll有效地等待设备上的数据可用,但我宁愿使用便携式(包括Windows)asio功能来实现类似的效果。在asio上有asio::descriptor_base::bytes_readable允许我事先测试数据是否可用,但是我必须在活动循环中测试它以阻止数据可用。

asio是否有办法在数据可用时只调用异步回调?例如。我可以屏蔽async_read_until中的错误,以免在这些错误上调用回调吗?

1 个答案:

答案 0 :(得分:0)

如果您想在可用时阅读数据,我建议您使用async_read_some功能代替async_read_until,请参阅Streams, Short Reads and Short Writes

典型的读处理程序如下所示:

void read_handler(const boost::system::error_code& error, size_t bytes_transferred)
{
  if (error != boost::asio::error::operation_aborted)
  {
    if (error)
      // handle error
    else
    {
      // process bytes_transferred data from the buffer
      // enable reception by calling async_read_some on the socket with a buffer
    }
  }
}