boost::asio::write 阻塞是什么意思?

p0f*_*0fi 4 c++ boost boost-asio

我正在使用boost::asio::write()将数据从缓冲区写入 com-Port。这是一个波特率为 115200 的串行端口,这意味着(据我所知)我可以有效地将 11520 字节/秒或 11,52 KB/秒的数据写入套接字。

现在我有一大块数据(10015 字节)要写入。我认为这应该需要不到一秒钟的时间才能真正在端口上写入。但是boost::asio::write()在使用传输的字节 10015 调用后已经返回 300 微秒。我认为在那个波特率下这是不可能的?

所以我的问题是它实际上在做什么?真正将其写入端口,或者只是其他类型的缓冲区,稍后将其写入端口。

我希望write()只有在所有字节真正写入端口后才返回。

编辑代码示例:

问题是我总是遇到未来/承诺的超时,因为发送消息需要超过 100 毫秒,但我认为计时器应该只在发送最后一个字节后启动。因为write()应该阻塞?

void serial::write(std::vector<uint8_t> message) {
  //create new promise for the request
  promise = new boost::promise<deque<uint8_t>>;
  boost::unique_future<deque<uint8_t>> future = promise->get_future();
  // --- Write message to serial port --- //
  boost::asio::write(serial_,boost::asio::buffer(message));
  //wait for data or timeout
  if (future.wait_for(boost::chrono::milliseconds(100))==boost::future_status::timeout) {
    cout << "ACK timeout!" << endl;
    //delete pointer and set it to 0
    delete promise;
    promise=nullptr;
  }
  //delete pointer and set it to 0 after getting a message
  delete promise;
  promise=nullptr;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?谢谢!

Tan*_*ury 5

简而言之,boost::asio::write()阻塞直到所有数据都写入流;它不会阻塞,直到所有数据都传输完毕。要等到数据传输完毕,请考虑使用tcdrain().

每个串行端口在内核空间内都有一个接收和发送缓冲区。这允许内核在进程无法立即从串行端口读取数据时缓冲接收到的数据,并在设备无法立即传输时允许缓冲写入串行端口的数据。要阻塞直到数据传输完毕,可以使用.tcdrain(serial_.native_handle())

这些内核缓冲区允许写入和读取速率超过发送和接收速率。然而,虽然应用程序写入数据的速度可能比串口传输的速度快,但内核会以适当的速度传输。