阻塞 boost::asio::write 是什么意思?
What means blocking for boost::asio::write?
我正在使用 boost::asio::write()
将数据从缓冲区写入 com 端口。这是一个波特率为 115200 的串行端口,这意味着(据我所知)我可以有效地将 11520 byte/s 或 11,52KB/s 数据写入套接字。
现在我有一大块数据(10015 字节)要写入。我认为这应该需要不到一秒钟的时间才能真正写入端口。但是 boost::asio::write()
returns 在传输字节 10015 的调用之后已经 300 微秒了。我认为这在那个波特率下是不可能的?
所以我的问题是它实际上在做什么?真的将它写入端口,或者可能只是某种其他类型的缓冲区,稍后将其写入端口。
我希望 write()
在所有字节 真正 写入端口后仅 return。
编辑代码示例:
问题是我总是 运行 进入 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()
blocks until all data has been written to the stream; it does not block until all data has been transmitted. To wait until data has been transmitted, consider using tcdrain()
。
每个串口在内核中都有一个接收和发送缓冲区space。如果进程不能立即从串行端口读取,这允许内核缓冲接收数据,并允许数据写入 到要缓冲的串行端口,如果设备不能立即 传输 它。要阻塞直到数据被传输,可以使用 tcdrain(serial_.native_handle())
.
这些内核缓冲区允许写入和读取速率超过传输和接收速率。但是,虽然应用程序写入数据的速度可能比串行端口传输的速度更快,但内核将以适当的速度传输。
我正在使用 boost::asio::write()
将数据从缓冲区写入 com 端口。这是一个波特率为 115200 的串行端口,这意味着(据我所知)我可以有效地将 11520 byte/s 或 11,52KB/s 数据写入套接字。
现在我有一大块数据(10015 字节)要写入。我认为这应该需要不到一秒钟的时间才能真正写入端口。但是 boost::asio::write()
returns 在传输字节 10015 的调用之后已经 300 微秒了。我认为这在那个波特率下是不可能的?
所以我的问题是它实际上在做什么?真的将它写入端口,或者可能只是某种其他类型的缓冲区,稍后将其写入端口。
我希望 write()
在所有字节 真正 写入端口后仅 return。
编辑代码示例:
问题是我总是 运行 进入 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()
blocks until all data has been written to the stream; it does not block until all data has been transmitted. To wait until data has been transmitted, consider using tcdrain()
。
每个串口在内核中都有一个接收和发送缓冲区space。如果进程不能立即从串行端口读取,这允许内核缓冲接收数据,并允许数据写入 到要缓冲的串行端口,如果设备不能立即 传输 它。要阻塞直到数据被传输,可以使用 tcdrain(serial_.native_handle())
.
这些内核缓冲区允许写入和读取速率超过传输和接收速率。但是,虽然应用程序写入数据的速度可能比串行端口传输的速度更快,但内核将以适当的速度传输。