2017-08-26 102 views
2

我想读取来自arduino的串行数据,但是当我运行我的程序时,它只读取缓冲区中的所有数据,这是实际在程序启动之前发送的数据。然后我终止与以下错误:提升asio串口“文件结尾”

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(); 
} 

据我所知read函数应该阻塞,所以它等待下一个输入,对吧?那么它怎么能到达“文件”的末尾?

+0

嗨,我有同样的问题。更糟糕的是,昨天工作的*二进制*会带来与现在一样的问题。可能由于一些超时设置。 –

+0

所以我今天再次运行完全相同的代码,使用完全相同的编译过程,现在它神奇地工作... –

回答

2

这是我工作的。您需要给串行端口一个最小字符数限制以具备阻止功能。

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

编辑:一个更好的选择,似乎刚才设置的端口原始模式。

stty -F /dev/ttyUSB0 raw 
+0

我应该把这个放在哪里? –

+0

如果在运行程序之前使用Linux,您的命令行。 –

+0

谢谢,这似乎解决了这个问题。 –

0

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

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