【问题标题】:Clear input data from serial port in boost::asio从 boost::asio 中的串口清除输入数据
【发布时间】:2015-06-24 17:19:04
【问题描述】:

我正在编写一个 C++ 程序,用于使用 boost::asio 通过串行端口与 Arduino 进行通信。建立连接后,Arduino 会自行重置。然而,C++ 程序的输入缓冲区仍然包含从 Arduino 发送的旧数据。由于我对这些数据没有用处,我想清除输入缓冲区。我怎样才能使用 boost::asio 来做到这一点?

我的代码目前如下所示:

#include <boost/asio.hpp>
#include <vector>
#include <iostream>

using namespace std;
using namespace boost::asio;

int main()
{
    io_service io_service;
    serial_port port(io_service, "/dev/ttyACM0");
    port.set_option(serial_port_base::baud_rate(9600));
    vector<char> buf(1);
    read(port, buffer(buf));
    cout << (int) buf[0] << endl;
    return 0;
}

代码应该在读取命令处暂停并等待 arduino 发送串行数据。但是有旧数据导致代码立即继续。

【问题讨论】:

  • 每次重置都可以一直看下去吗?
  • @Ben 当我打开串口时,Arduino 会自动重置,所以我看不到在重置之前读取所有数据的方法。然而,在重置 Arduino 后读取数据对我来说似乎有风险,因为 Arduino 可以在我仍在清除缓冲区的过程中开始发送数据。
  • The Arduino automatically resets when i open the serial port,为什么要这样做?你是这样设计的吗?
  • @Ben 这是 Arduino 的默认行为。
  • 这听起来不太理想,也许你应该这样做this

标签: c++ serial-port arduino boost-asio


【解决方案1】:

您可以刷新串行缓冲区,这应该可以执行您想要的操作(在刷新之前清除所有待处理的数据)。不幸的是,Boost 似乎没有执行此操作的包装器,因此您必须获取串行端口的 native_handle。我基于这个答案使用的代码: https://stackoverflow.com/a/22598329/1167230

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多