【问题标题】:Boost asio serial port "end of file"Boost asio串口“文件结束”
【发布时间】:2017-08-26 14:24:36
【问题描述】:

我正在尝试读取来自 arduino 的串行数据,但是当我运行我的程序时,它只读取缓冲区中的所有数据,即在程序启动之前实际发送的数据。然后 i 以以下错误终止:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what():  read: End of file
Aborted (core dumped)

我什至不想要程序执行之前的数据。这是我的 C++ 代码:

#include <iostream>
#include <stdint.h>

#include <boost/asio.hpp>
#include <boost/asio/serial_port.hpp>

using namespace boost;

int main() {
    asio::io_service io;
    asio::serial_port port(io);

    port.open("/dev/ttyUSB0");
    port.set_option(asio::serial_port_base::baud_rate(115200));

    char d;

    while ( true ) {
        asio::read(port, asio::buffer(&d, 1));
        std::cout << d << std::endl;
    }

    port.close();
}

据我所知,读取功能应该是阻塞的,所以它等待下一个输入,对吧?那么怎么才能到达“文件”的末尾呢?

【问题讨论】:

  • 您好,我也遇到了同样的问题。更糟糕的是,昨天运行的 binary 给出了与今天相同的问题。可能是由于一些超时设置。
  • 所以我今天再次运行完全相同的代码,编译过程完全相同,现在它神奇地工作了......

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


【解决方案1】:

这对我有用。您需要为您的串行端口设置一个最小字符限制才能具有阻塞功能。

stty -F /dev/ttyUSB5 115200 line 0 min 1 time 0

编辑:更好的选择似乎只是将端口设置为原始模式。

stty -F /dev/ttyUSB0 raw

【讨论】:

  • 我应该把这个放在哪里?
  • 如果使用 Linux,请在运行程序之前使用命令行。
【解决方案2】:

所以我发现在以 root 身份运行 Arduino IDE 后,为了允许串行通信,我的程序停止工作,并且出现 EOF 错误。即使在 Arduino IDE 关闭后它也不起作用,重新启动我的电脑可以让它再次工作。

但 Atilla Filiz 的回答解决了这个问题。

【讨论】:

    猜你喜欢
    • 2015-06-05
    • 1970-01-01
    • 2012-09-20
    • 2012-02-21
    • 2011-02-17
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多