C++ boost::asio::write的阻塞意味着什么?

C++ boost::asio::write的阻塞意味着什么?,c++,boost,boost-asio,C++,Boost,Boost Asio,我正在使用boost::asio::write()将数据从缓冲区写入com端口。它是一个波特率为115200的串行端口,这意味着(据我所知)我可以有效地将11520字节/秒或11,52KB/s的数据写入套接字 现在我有一大块数据(10015字节)要写。我认为这应该需要不到一秒钟的时间在端口上真正写入。但是boost::asio::write()在调用后已返回300微秒的传输字节10015。我认为这是不可能的波特率 所以我的问题是它到底在做什么?真的将它写入端口,或者只是某种其他类型的缓冲区,它随

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

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

所以我的问题是它到底在做什么?真的将它写入端口,或者只是某种其他类型的缓冲区,它随后将它写入端口

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

使用代码示例进行编辑:

问题是,我总是遇到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;
}
void serial::write(std::vector message){
//为请求创建新承诺
承诺=新的激励::承诺;
boost::unique_future=promise->get_future();
//---将消息写入串行端口--//
boost::asio::write(串行,boost::asio::buffer(消息));
//等待数据或超时
if(future.wait_for(boost::chrono::毫秒(100))==boost::future_状态::超时){
CUT 

简而言之,块直到所有数据都被写入流;直到所有数据都被传输,它才被阻止。要等到数据被传输,考虑使用。 每个串行端口在内核空间内都有一个接收和发送缓冲区。如果进程无法立即从串行端口读取接收到的数据,则内核可以缓冲接收到的数据;如果设备无法立即发送,则可以缓冲写入串行端口的数据。要阻止数据传输,可以使用

tcdrain(serial.native\u handle())


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

波特率真的与比特率相同吗?1是每秒一个符号。如果端口使用编码超过1位的符号,比特率实际上可以超过波特率。老实说,我不知道确切的数字。但我不认为我可以在300微秒内写入10k的数据。我如何知道一个符号中编码了多少位?端口的配置为字符大小8和一个停止位。请检查:。您正在以大约14KB/s