异步提升读取串行端口
Reading a Serial Port Asynchronously Boost
我正在尝试从串行端口异步读取几个字节。目前我正在使用的代码(源代码是How do I perform a nonblocking read using asio?)只允许我读取1个字节,然后退出。我如何获得它,以便代码继续读取,直到串行端口中不再有传入数据?谢谢:)
void foo()
{
boost::asio::io_service io_svc;
boost::asio::serial_port ser_port(io_svc, "/dev/ttyS0");
boost::asio::deadline_timer timeout(io_svc);
unsigned char my_buffer[2];
bool data_available = false;
ser_port.async_read_some(boost::asio::buffer(my_buffer),
boost::bind(&read_callback, boost::ref(data_available),
boost::ref(timeout),boost::asio::placeholders::error(),
boost::asio::placeholders::bytes_transferred()));
timeout.expires_from_now(boost::posix_time::seconds(30));
timeout.async_wait(boost::bind(&wait_callback, boost::ref(ser_port),boost::asio::placeholders::error()));
io_svc.run();
io_svc.
if(!data_available)
{
ser_port.close();
cout << "ser_port was closed";
}
}
void read_callback(bool& data_available, boost::asio::deadline_timer& timeout, const boost::system::error_code& error, std::size_t bytes_transferred)
{
if (error || !bytes_transferred)
{
// No data was read!
data_available = false;
return;
}
timeout.cancel();
data_available = true;
}
void wait_callback(boost::asio::serial_port& ser_port, const boost::system::error_code& error)
{
if (error)
{
// Data was read and this timeout was cancelled
return;
}
ser_port.cancel();
}
在read_callback
中,取消计时器,不开始新的读取
那么你希望ASIO做什么呢?你刚刚取消了所有的处理程序,就像文档中的状态一样,当没有处理程序时,run方法将返回。
因此,如果你想拥有比收到的一个字节更多的数据,你可以做两件事:
首先,只需向asio发出另一个调用,即可从端口读取更多信息。
void read_callback(bool& data_available, boost::asio::deadline_timer& timeout, const boost::system::error_code& error, std::size_t bytes_transferred)
{
if (error || !bytes_transferred)
{
// No data was read!
data_available = false;
return;
}
// do something with the data you just read
ser_port.async_read_some(boost::asio::buffer(my_buffer),
boost::bind(&read_callback, boost::ref(data_available),
boost::ref(timeout),boost::asio::placeholders::error(),
boost::asio::placeholders::bytes_transferred()));
//restart your timer
data_available = true;
}
或者您可以添加使用transfer_at_least
来至少获得所需的数据量。
相关文章:
- C++输出与Python不同的消息(从串行端口读取)
- 无法从串行端口读取.WaitCommEvent() 永远不会返回
- 读取文件在多次串行端口读取后ERROR_INVALID_HANDLE
- 使用 C++ 从 Linux 串行端口读取会提供混乱的数据
- C 从具有CreateFile的串行端口读取
- 从串行端口读取确切的N个字节
- 如何在使用 WxWidgets 从串行端口读取时不断更新我的面板绘图
- 串行端口:读取文件和关闭句柄
- 从串行端口读取而不从缓冲区中删除(linux)
- 仅当数据从另一侧(c++)发送时,才从串行端口读取
- 使用C++/Visual Studio从串行端口读取数据
- Linux 串行端口读取 - 我可以更改输入缓冲区的大小吗?
- 使用升压asio从串行端口读取最新数据
- C、Linux 中的串行端口读取/打开错误
- 阻止串行端口读取
- boost::asio 在从串行端口读取时阻止 std::cout
- 在Visual C++Express 2010中从串行端口读取
- 如何正确使用COMMTIMEOUTS和从串行端口读取的OVERLAPPED IO模式
- 从c++中的串行端口读取不同包大小的数据流的最佳方式
- 在c++和Linux中,在有超时的情况下向串行端口写入和从串行端口读取数据