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