在linux上,串行端口在第一对读写之后挂起
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是调试这类问题的一个很好的工具
相关文章:
- 用C++快速读写文件
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 在一个读写器队列中,我可以用volatile替换原子吗
- C++套接字对不读/写父/子
- 如何调试读写器锁的死锁?
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- Linux 挂载使用重新挂载以允许读写
- C++中读/写二进制文件
- 如何读/写或遍历 std::array 中的特定元素范围?
- 内存排序或读取-修改-写入操作,仅(读/写)内存顺序
- USB-HID 读/写(重叠)等待单个对象不返回C++
- 为什么使用_access时只读测试对读写文件有效
- Boost::Asio串行读/写打开:参数不正确
- 读/写 OpenMP 中的共享向量会减慢程序速度
- 谷歌测试读写同一文件失败
- Android USB 附件模式无法使用 libusb 与主机 PC 一起读/写
- 特定时间间隔 C++ 上的读写日志
- SQLite - C++中的多线程读写
- 在linux上,串行端口在第一对读写之后挂起