繁体   English   中英

使用挂起的read_async_some关闭boost :: asio :: serial_port

[英]Closing boost::asio::serial_port with pending read_async_some

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

此函数会立即完成所有未完成的异步读取或写入操作,并且取消操作的处理程序将传递boost::asio::error::operation_aborted错误。

但是,当我尝试这个时,我的处理程序被调用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创建模拟环回串口,我能够解决这个问题。 这篇博客文章中有很好的说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM