c++ - boost::asio 在从串行端口读取时阻塞 std::cout

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

我正在使用 boost::asio从串行端口读取。我不断的从串口读取,通过std::cout打印出来.但是一些奇怪的事情发生了。

我正在使用 TimeoutSerial来自 here 的类(class).我的代码是这样的:

#include <iostream>
#include "TimeoutSerial.h"

using namespace std;

int main(){  
  TimeoutSerial serial;

  serial.open("/dev/ttyACM0", 9600 );      
  serial.setTimeout(boost::posix_time::seconds(1));

  char c = '0';
  while(true){
    try{
      serial.read( &c, 1 );
      cout << c;
    }catch( std::runtime_error err ){
      cout << "Error: " << err.what()<< endl;
    }
  }         
  return 0;
}

我没有得到任何输出,我也不知道为什么。当我改变 cout << c;cout << c << endl;我得到了我想要的输出,但每个字符都在一个新行上,这是不受欢迎的。

谁能告诉我为什么会这样?

最佳答案

std::cout 默认情况下是缓冲的,因此您需要刷新它以在您的终端上显示它。使用 std::endl 隐含地执行此操作,std::flush() 也是如此。将循环更改为

while(true) {
    try {
      serial.read( &c, 1 );
      cout << c;
      std::flush( std::cout );
    } catch ( std::runtime_error err ) {
      cout << "Error: " << err.what() << endl;
    }
}      

关于c++ - boost::asio 在从串行端口读取时阻塞 std::cout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18634062/

相关文章:

c++ - 为什么这个二进制 apply_visitor 不工作?

.net - 不断从具有后台线程的串行端口读取

c++ - 使用 C/C++ 创建多线程应用程序的最简单方法是什么?

c++ - boost 野兽中的多部分边界

c++ - 有没有办法在 c++ 的 uint64_t 中获取日期的 utc 纳秒

c# - 串行端口与 MSComm

java - 首次 Socket I/O 请求响应速度快,但与远程串行端口通信时每隔一段时间响应速度就慢

C++ 正则表达式库

c++ - 容器的无序迭代

c++ - 如何制作递归编译时可变结构模板