diff --git a/src/methane_serial_port.cpp b/src/methane_serial_port.cpp index 1961f89..b9777e9 100644 --- a/src/methane_serial_port.cpp +++ b/src/methane_serial_port.cpp @@ -93,7 +93,6 @@ timer_.expires_from_now(boost::posix_time::seconds(1)); timer_.async_wait([this](const boost::system::error_code &error) { if (!error) { - buffer_.consume(buffer_.size()); // 每次启动都清空缓冲区 read_from_port(); } }); @@ -101,37 +100,26 @@ //CC 05 00 00 00 00 0D 77 void MethaneSerialPort::read_from_port() { - // 检查缓冲区中是否有足够的数据 - if (buffer_.size() >= 8) { - std::istream is(&buffer_); - std::vector response(8); - is.read(reinterpret_cast(response.data()), 8); - - // 检查数据包的头和尾 - if (response[0] == 0xCC && response[7] == 0x77) { - handle_response(response); - - // 清空 buffer_,确保不缓存数据 - buffer_.consume(8); - } else { - // 数据包不完整或不正确,丢弃该数据包 - buffer_.consume(buffer_.size()); - } - - // 重新启动定时器 - start_timer(); - return; - } - async_read( - port_, buffer_, boost::asio::transfer_at_least(1), + port_, buffer_, boost::asio::transfer_at_least(8), [this](const boost::system::error_code &error, const size_t) mutable { if (!error) { - read_from_port(); // 递归调用以继续检查数据 - } else { - // 清空 buffer_,即使发生错误 + if (buffer_.size() >= 8) { + std::istream is(&buffer_); + std::vector response(8); + is.read(reinterpret_cast(response.data()), 8); + if (response[0] == 0xCC && response[7] == 0x77) { + handle_response(response); // 处理最新的一帧 + } + } + // 丢弃所有缓存数据 buffer_.consume(buffer_.size()); + + // 继续下一次读取 + read_from_port(); + } else { start_timer(); } - }); + } + ); }