【问题标题】:boost::asio blocks std::cout when reading from serial port从串口读取时 boost::asio 会阻塞 std::cout
【发布时间】:2013-09-05 10:37:04
【问题描述】:

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

我正在使用来自hereTimeoutSerial 类。我的代码是这样的:

#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 &lt;&lt; c; 更改为cout &lt;&lt; c &lt;&lt; endl; 时,我得到了我想要的输出,但每个字符都在一个新的行上,这是不可取的。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

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