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

What means blocking for boost::asio::write?

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

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

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

我希望 write() 在所有字节 真正 写入端口后仅 return。

编辑代码示例:

问题是我总是 运行 进入 future/promise 超时,因为发送消息需要超过 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;
}

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

简而言之,boost::asio::write() blocks until all data has been written to the stream; it does not block until all data has been transmitted. To wait until data has been transmitted, consider using tcdrain()

每个串口在内核中都有一个接收和发送缓冲区space。如果进程不能立即从串行端口读取,这允许内核缓冲接收数据,并允许数据写入 到要缓冲的串行端口,如果设备不能立即 传输 它。要阻塞直到数据被传输,可以使用 tcdrain(serial_.native_handle()).

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