他の誰かが遭遇したようですが、ここで質問されていないようです。私は非常にブーストasioを使用してシリアルポートを開いたり閉じたりする単純なアプリケーションです(より大きなアプリケーションを構築する前に簡単なデバッグをやろうとしています。)コールはqtベースのguiにあります。今すぐウィンドウコンストラクタで設定されていますboost asioを使用してシリアルポートを閉じることができません
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
メソッドでスタックしているようです。
私はこれについてもう1つの投稿を見ましたが(https://cpc110.blogspot.com/2017/03/boost-asio-can-not-close-serial-port.html)、その回答はありません。誰にもこれに関する考えはありますか?
私はUbuntu 16.04 LTSでboost 1.58とQt 5.8を使用しています。
答えをいただきありがとうございます。これを展開できますか?なぜそれはすでに破壊されているのだろうか? shared_ptrによって参照されているので、削除後までサービスが破壊されることはないと思います。 – cirrusio
サービス[boost :: asio :: io_service io;]がスタック上に作成され、MainWindowコンストラクタの終了時に破棄されます。また、Qtには独自のQSerialPortクラスがありますが、それを使用していない理由は何ですか? – ManuelH