diff --git a/src/methane_serial_port.cpp b/src/methane_serial_port.cpp index 5f811f8..d2c0560 100644 --- a/src/methane_serial_port.cpp +++ b/src/methane_serial_port.cpp @@ -9,11 +9,11 @@ #include "tcp_service.hpp" void handle_response(const std::vector &buffer) { - const auto x = buffer[2] & 0xFFFF; - const auto y = buffer[3] & 0xFFF; - const auto z = buffer[4] & 0xFF; + const auto x = buffer[2]; + const auto y = buffer[3]; + const auto z = buffer[4]; const auto w = buffer[5]; - const auto result = x + y + z + w; + const auto result = x * (1 << 24) + y * (1 << 16) + z * (1 << 8) + w; TcpService::getInstance().update_gas_value(result); } @@ -41,33 +41,48 @@ //CC 05 00 00 00 00 0D 77 void MethaneSerialPort::read_from_port() { - async_read_until( - port_, buffer_, 0x77, - [this](const boost::system::error_code &error, const size_t bytes_transferred) mutable { + // 检查缓冲区中是否有足够的数据 + 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) { + // 数据包完整且正确 + std::cout << "received 8 bytes: "; + for (size_t i = 0; i < 8; ++i) { + std::cout << std::hex + << std::uppercase + << std::setw(2) + << std::setfill('0') + << static_cast(response[i]) + << " "; + } + std::cout << std::endl; + + handle_response(response); + + // 清空 buffer_,确保不缓存数据 + buffer_.consume(8); + } else { + // 数据包不完整或不正确,丢弃该数据包 + buffer_.consume(1); // 丢弃第一个字节并重新开始 + } + + // 重新启动定时器 + start_timer(); + return; + } + + async_read( + port_, buffer_, boost::asio::transfer_at_least(1), + [this](const boost::system::error_code &error, const size_t) mutable { if (!error) { - // 获取接收到的数据 - std::istream is(&buffer_); - std::vector response(static_cast(bytes_transferred)); - is.read( - reinterpret_cast(response.data()), static_cast(bytes_transferred) - ); - - std::cout << "received " << bytes_transferred << " bytes: "; - for (size_t i = 0; i < bytes_transferred; ++i) { - std::cout << std::hex - << std::uppercase - << std::setw(2) - << std::setfill('0') - << static_cast(response[i]) - << " "; - } - std::cout << std::endl; - - handle_response(response); - - start_timer(); + read_from_port(); // 递归调用以继续检查数据 } else { - std::cerr << "error: " << error.message() << std::endl; + // 清空 buffer_,即使发生错误 + buffer_.consume(buffer_.size()); start_timer(); } });