gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:38 25 4
gpt4 key购买 nike

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

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

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

我希望 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;
}

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

最佳答案

简而言之,boost::asio::write()阻塞,直到所有数据都被写入到流;它不会阻塞,直到所有数据都被传输。要等到数据被传输,考虑使用 tcdrain() .

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

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

关于c++ - boost::asio::write 的阻塞意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30078415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com