这意味着要阻止boost :: asio ::写
What means blocking for boost::asio::write?
我正在使用 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())
。
这些内核缓冲区允许写入和读取率超过发射率和接收率的速率。但是,尽管该应用程序可能以比串行端口传输更快的速率编写数据,但内核将以适当的速率传输。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- C++ Boost::asio串行通信与Arduino无法写入
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 执行时使用 boost::asio::d eadline_timer 时出错
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- boost::asio data owning `ConstBufferSequence`
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 如何将boost::asio::d eadline_timer 与Qt一起使用?
- 将更高的优先级设置为 boost::asio 线程处理进程
- Async_read_until限制读取的字节大小(Boost::asio)
- Boost Asio - boost::bind 导致程序崩溃
- 使用Asio(Boost)通过网络发送灵活的数据量