在linux上,串行端口在第一对读写之后挂起

Serial port hangs after first pair of read and write on linux

本文关键字:读写 之后 挂起 linux 串行端口      更新时间:2023-10-16

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

使用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是调试这类问题的一个很好的工具