c++ - Linux 上第一对读写后串口挂起

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

我必须编写一个与我们实验室中的硬件之一的串行通信。

使用 bash,我可以按照我想要的时间编写并接收响应:

cat < /dev/ttyUSB0 &
echo 'SM?' >/dev/ttyUSB0
# SM=0480;
echo 'SMM=0475;' > /dev/ttyUSB0
echo 'SM?;' > /dev/ttyUSB0
# SM=0475;

我用 asio 编写了一个简单的 C++ 应用程序,它应该具有相同的功能。

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

int main(){
  asio::io_service service;
  asio::serial_port port(service,"/dev/ttyUSB0");
  port.set_option(asio::serial_port_base::baud_rate(9600));
  port.set_option(asio::serial_port_base::character_size(8));
  port.set_option(asio::serial_port_base::parity(asio::serial_port_base::parity::none));
  port.set_option(asio::serial_port_base::stop_bits(asio::serial_port_base::stop_bits::one));
  port.set_option(asio::serial_port_base::flow_control( asio::serial_port_base::flow_control::none));


  std::vector<char> ret(100);
  int len;
  asio::error_code ignored;
  asio::write(port,asio::buffer("SM?;"),asio::transfer_all(),ignored);
  len=port.read_some(asio::buffer(ret),ignored);
  std::cout.write(ret.data(),len);
  asio::write(port,asio::buffer("SSM=0480;"),asio::transfer_all(),ignored);
  asio::write(port,asio::buffer("SM?;"),asio::transfer_all(),ignored);
  len=port.read_some(asio::buffer(ret),ignored);
  std::cout.write(ret.data(),len);

  std::cout << std::endl;
  port.cancel();
  port.close();
  service.stop();
  service.reset();
  return 0;
}

但是代码在第二次读取时挂起。我究竟做错了什么?

最佳答案

你是不是忘记了缓冲区中的\n? echo 向字符串添加一个 '\n' 字符,除非您使用 -n

调用它

strace 是调试此类问题的绝佳工具。

关于c++ - Linux 上第一对读写后串口挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23808252/

相关文章:

c++ - Arduino Nano:使用串行输入时,通过计时器进行的A4988步进控制不稳定

linux - 无法在 ubuntu 18.04 中为各种串行传感器读取 USB 到串行输入

c++ - 使用反射在 protobuf 消息中设置 oneof

c++ - 为 boost 的变换迭代器寻找复合特征模式

mysql - 与 MySQL (Apache Spark) 建立永久连接

linux - 内联 if shell 脚本

java - 如何在 Linux 上卸载 JDK 8 (8u73)?

java - 服务发现失败 - 使用 SPP 的蓝牙聊天连接

c++ - 字符串 vector (从键盘读取)

c++ - 将不同的对象传递给一个函数