2017-03-20 9 views
0

他の誰かが遭遇したようですが、ここで質問されていないようです。私は非常にブースト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.hpplockメソッドでスタックしているようです。

私はこれについてもう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を使用しています。

答えて

0

あなたのio_serviceがすでに破壊されている可能性があります。 MainWindowクラスのメンバーにしてください。

+0

答えをいただきありがとうございます。これを展開できますか?なぜそれはすでに破壊されているのだろうか? shared_ptrによって参照されているので、削除後までサービスが破壊されることはないと思います。 – cirrusio

+0

サービス[boost :: asio :: io_service io;]がスタック上に作成され、MainWindowコンストラクタの終了時に破棄されます。また、Qtには独自のQSerialPortクラスがありますが、それを使用していない理由は何ですか? – ManuelH

関連する問題