我遇到了其他人遇到的问题,但似乎没有在这里问过。我有一个非常简单的应用程序,现在只需使用boost asio打开和关闭一个串口(现在只需要在构建一个更大的应用程序之前尝试进行一些简单的调试。这些调用驻留在基于qt的gui中现在,串口通信在窗口构造函数中设置:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(getData()));
timer->start(1000);
std::string comm = "/dev/ttyUSB0";
boost::asio::io_service io;
port = std::shared_ptr<boost::asio::serial_port>(new boost::asio::serial_port(io, comm));
std::cout << "Port has been successfully opened..." << std::endl;
boost::asio::serial_port_base::baud_rate baud(19200);
port->set_option(baud);
std::cout << "Baud rate set to 19200..." << std::endl;
getData();
}
getData
将定期包含对串行端口的调用,但是现在它只是请求使用当前时间在gui上填充时间戳。
在析构函数中关闭端口
MainWindow::~MainWindow()
{
if (port->is_open()) port->close();
delete ui;
}
当关闭gui时,会调用析构函数,但系统只是在关闭端口时挂起。它似乎陷入了posix_mutex.hpp
lock
方法的阻碍。
我已经看过另一篇关于此事的帖子(https://cpc110.blogspot.com/2017/03/boost-asio-can-not-close-serial-port.html),但似乎没有答案。有没有人对此有任何想法?
我在Ubuntu 16.04 LTS上使用boost 1.58和Qt 5.8。
答案 0 :(得分:0)
问题可能是(我自己提倡:: asio),你的io_service已经被破坏了。尝试使其成为MainWindow类的成员。