![](/img/trans.png)
[英]Serial port in C++ on Linux. Can read and write on serial port happen simultaneously..?
[英]Serial port hangs after first pair of read and write on linux
我必须与实验室中的硬件之一进行串行通信。
使用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是调试此类问题的好工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.