我想使用asio从串行设备读取并在字节可用时处理它们。
使用async_read_until
时,由于文件结束(EOF)错误,大部分时间都会调用我的回调。因此,我需要退出回调并再次注册,直到数据可用。这导致繁忙的循环,我想阻止。类似的情况发生在read_until
,它会立即以相同的EOF错误返回。
对于POSIX,poll
有效地等待设备上的数据可用,但我宁愿使用便携式(包括Windows)asio功能来实现类似的效果。在asio上有asio::descriptor_base::bytes_readable
允许我事先测试数据是否可用,但是我必须在活动循环中测试它以阻止数据可用。
asio是否有办法在数据可用时只调用异步回调?例如。我可以屏蔽async_read_until
中的错误,以免在这些错误上调用回调吗?
答案 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
}
}
}