请求协助:将代码从Boost 1.60升级至Boost 1.82,需替代废弃方法
Boost 1.60 升级到 1.82:Asio 废弃 API 替代方案
核心变化说明
Boost Asio 在后续版本中完成了 API 迭代:用io_context替代旧的io_service,弃用deadline_timer改用基于时钟的定时器类。以下是你代码中各失效部分的具体替换方案:
1. deadline_timer 的替代
旧代码:
timer(port.get_io_service());//boost::asio::deadline_timer timer;
替换为:
推荐使用steady_timer(基于单调时钟,不受系统时间调整影响),构造时直接传入io_context实例:
boost::asio::io_context io_ctx; boost::asio::steady_timer timer(io_ctx);
若需依赖系统时钟,可改用boost::asio::system_timer。
2. get_io_service().reset() 的替代
旧代码:
port.get_io_service().reset();//boost::asio::serial_port& port;
替换为:
直接调用serial_port关联的io_context对象的reset()方法(serial_port构造时需传入io_context):
io_ctx.reset();
3. async_read 用法调整
旧代码:
boost::asio::async_read(port, boost::asio::buffer(&c, 1);
async_read本身仍可使用,但需补全符合当前版本要求的回调函数:
char c; boost::asio::async_read(port, boost::asio::buffer(&c, 1), [&](const boost::system::error_code& ec, std::size_t bytes_transferred) { if (!ec) { // 处理读取到的字符c } });
4. get_io_service().run() 的替代
旧代码:
port.get_io_service().run();
替换为直接调用io_context的run()方法:
io_ctx.run();
完整替换后的代码示例
#include <boost/asio.hpp> #include <boost/system/error_code.hpp> int main() { boost::asio::io_context io_ctx; boost::asio::serial_port port(io_ctx, "/dev/ttyUSB0"); // 替换为你的实际串口路径 // 替代原deadline_timer boost::asio::steady_timer timer(io_ctx); char c; // 异步读取串口数据 boost::asio::async_read(port, boost::asio::buffer(&c, 1), [&](const boost::system::error_code& ec, std::size_t bytes_transferred) { if (!ec) { // 此处添加读取后的业务逻辑 } }); io_ctx.reset(); // 重置io_context以准备运行 io_ctx.run(); // 启动事件循环处理异步操作 return 0; }
额外注意事项
- 所有Asio对象(
serial_port、steady_timer等)必须关联同一个io_context实例,不能再通过对象间接获取服务。 - 若需实现超时逻辑,
steady_timer可通过expires_after()/expires_at()设置超时时间,配合async_wait()完成回调。
内容的提问来源于stack exchange,提问作者al072
相关产品推荐
相关产品推荐

