gpt4 book ai didi

c++ - 将 boost::asio::async_wait_until 与 boost::asio::streambuf 一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:43:56 26 4
gpt4 key购买 nike

我目前正在开发一个应用程序,用于使用串行通信与设备进行通信。为此,我使用了 boost 库 basic_serial_port。现在,我只是尝试从设备读取数据,并使用 async_wait_until 函数和 deadline_timer 类中的 async_wait。设置读取和等待的代码如下所示:

async_read_until(port,readData,io_params.delim,
boost::bind(&SerialComm::readCompleted,
this,boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));

timer.expires_from_now(boost::posix_time::seconds(1));
timer.async_wait(boost::bind(&SerialComm::timeoutExpired,this,
boost::asio::placeholders::error));

async_read_until 的回调看起来像

void SerialComm::readCompleted(const boost::system::error_code& error,
const size_t bytesTransferred){
if (!error){
wait_result = success;
bytes_transferred = bytesTransferred;
}
else {
if (error.value() != 125) wait_result = error_out;
else wait_result = op_canceled;

cout << "Port handler called with error code " + to_string(error.value()) << endl;
}

}

读取成功后触发以下代码

string msg;
getline(istream(&readData), msg, '\r');
boost::trim_right_if(msg, boost::is_any_of("\r"));

对于此设备,所有 消息都以回车结束,因此在 async_read_until 中指定回车应该会检索到一条消息。然而,我所看到的是,当处理程序被触发时,新数据不一定会输入到缓冲区中。所以,我可能看到的是,如果处理程序被触发 20 次

  • 在第一次调用时将一行注入(inject)缓冲区
  • 在接下来的 6 次通话中都没有
  • 6 行在下一个电话中
  • 接下来的 10 天内没有数据
  • 10 行以下...

我显然做错了什么,但这是什么?

最佳答案

async_read_until 不保证它只读到第一个定界符。

由于底层实现细节,它在大多数系统上只会“读取可用的内容”,如果流缓冲区包含定界符则返回。 其他数据将在 streambuf 中。此外,EOF 可能会返回,即使您还没有预料到。

请参阅背景 Read until a string delimiter in boost::asio::streambuf

关于c++ - 将 boost::asio::async_wait_until 与 boost::asio::streambuf 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43266671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com