正在关闭具有挂起的read_async_some的boost::asio::serial_port

Closing boost::asio::serial_port with pending read_async_some

本文关键字:async some boost asio port serial read 挂起      更新时间:2023-10-16

我正在链接read_async_some()调用以从串行端口异步读取。在某个时刻,我需要使用取消异步读取,并在关联的处理程序中检测到这一事实。从cancel()的文档中,我希望通过检查传递给我的处理程序的error_code来做到这一点:

此函数导致所有未完成的异步读取或写入要立即完成的操作,以及的处理程序已取消操作将传递CCD_ 4错误。

但是,当我尝试这样做时,调用我的处理程序时会出现invalid_argument错误,而不是预期的operation_aborted错误。下面是一个最小的例子,通过使用ptty来模拟串行端口来重现这个问题:

void handle(boost::system::error_code const& error, size_t count)
{
    std::cout << "error_code = " << error.message() << std::endl;
}
int main(int argc, char **argv)
{
    std::fstream fs("/dev/ttyp0", std::ios::in | std::ios::ate);
    boost::asio::io_service io;
    boost::asio::serial_port serial(io, "/dev/ttyp0");
    std::vector<uint8_t> buffer(1);
    serial.async_read_some(boost::asio::buffer(buffer),
        boost::bind(&handle,
                    boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred
        )
    );
    boost::thread thread(boost::bind(&boost::asio::io_service::run, &io));
    serial.cancel();
    thread.join();
    fs.close();
}

至少对我来说,这个程序的输出是error_code = Invalid argument。有人能解释为什么我没有得到文档中描述的行为吗?

永不终止。如果其他人遇到同样的问题,问题实际上是使用pttys进行测试。事实证明,pttys在用于异步输入时行为不正常,boost::asio在上面的错误消息中指出了这个问题。

我能够通过使用socat创建一个模拟环回串行端口来解决这个问题。在这篇博客文章中有很好的说明。