这意味着要阻止boost :: asio ::写

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

本文关键字:asio boost 意味着      更新时间:2023-10-16

我正在使用 boost::asio::write()从缓冲区写入com-port。这是一个带有波特率115200的串行端口,这意味着(就我的理解而言),我可以有效地编写11520字节/s或11,52kb/s的数据。

现在,我要写的是大量数据(10015个字节)。我认为这应该花费不到一秒钟的时间才能真正写在端口上。但是boost::asio::write()在通过转移的字节10011中的通话后返回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;
}

我该如何实现?谢谢!

简而言之, boost::asio::write()块,直到所有数据都已写入流到流为;直到所有数据都已传输之前,它才能阻止。要等到数据传输,请考虑使用tcdrain()

每个串行端口都在内核空间内具有接收缓冲液和传输缓冲区。如果一个过程无法立即从串行端口读取如果设备无法立即发送,请缓冲。要阻止数据传输到数据,可以使用tcdrain(serial_.native_handle())

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