我正在链接read_async_some()
来自串口异步读取的调用。在某些时候,我需要取消异步读取,并在关联的处理程序中检测此事实。从the documentation for 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
。谁能解释为什么我没有得到文档中描述的行为?
答案 0 :(得分:4)
没关系。如果其他人遇到同样的问题,问题实际上是使用pttys进行测试。事实证明,当用于异步输入时,pttys的行为不正常,boost::asio
表示上述错误消息存在此问题。
我能够通过使用socat
创建模拟环回串行端口来解决此问题。在this blog post中有很好的说明。