2016-04-02 15 views
0

私はArduinoのプロジェクト用のGUIをビルドしようとしていました。プロジェクト自体は、港のコンテナ管理のための車ロボットに関するものであり、開発段階(そして最終リリース時)には、監視してコマンドを送信する方法があることが涼しいでしょう。
最初にシリアルポート経由で通信を実装してから、無線通信機などのコードを書き直したり再利用したりすることをお勧めします。コードはまでうまくいっていましたが、いくつかのバグはです。なぜ私は一時変数としてQSerialPort *を使用できますが、Qt 5.5.1ではクラスのメンバーとして使用できませんか?

最初に、Qtのウェブサイトで入手可能なseveral programsの例に従って、QSerialPortおよびQSerialPortInfoが使用されました。コンパイラは、不足している"QT+=serialport"についてのいくつかのエラーと間違ったフォワード宣言について表示しましたが、しばらくしてから修正することができました。そして、シリアルポートを開くためのコードが書かれたとき、プログラムは

いくつかの時間後、このGUI Qtのコード(およびそれぞれのコンソールバージョン)が動作します...クラッシュし始め、問題例示:


mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QtSerialPort/QSerialPortInfo> 
#include <QtSerialPort/qserialport.h> 
#include <QMainWindow> 

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow { 

    public: 
     explicit MainWindow(QWidget *parent = 0); 
     ~MainWindow(); 

    private: 
     Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 


mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { 

    ui->setupUi(this); 

    QSerialPort *connected_port; 
    connected_port = new QSerialPort; 

} 

MainWindow::~MainWindow() { 
    delete ui; 
} 


main.cppに

#include <QApplication> 
#include <QMainWindow> 

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow { 

    public: 
     explicit MainWindow(QWidget *parent = 0); 
     ~MainWindow(); 

    private: 
     Ui::MainWindow *ui; 
}; 

int main(int argc, char *argv[]) { 

    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 


しかしちょうどmainwindow.hを変更し、MainWindowsのprivateセクションでQSerialPort *connected_port;を挿入し、mainwindow.cppからそれを削除した後、この単純なプログラムが開始さにクラッシュ。

(...) 

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { 

    ui->setupUi(this); 

    connected_port = new QSerialPort; 

} 

    (...) 

mainwindow.h

(...) 

class MainWindow : public QMainWindow { 

    (...) 

    private: 
     QSerialPort *connected_port; 
     Ui::MainWindow *ui; 
}; 

    (...) 

mainwindow.cppがクラッシュします。 qtの端末の例でも同様のアプローチですが、なぜ動作するのかわかりませんでした。このコードはそうではありません。どのように動作させる?

+0

これがうまくいかない理由はわかりませんが、いくつかのアプリケーションで同じことをしています。おそらく、次のようにコンストラクタを呼び出すことを試みてください:... = new QSerialPort( "myport"); –

+0

@TheBadgerそれはいい考えですが、うまくいきませんでした(QSerialPortInfoのコンストラクタではありません) –

答えて

0

解決済み。なんらかの理由で.proファイルに"QT+=widgets"を追加すると、すでに追加されたのとは別の機能プログラムが作成されました。"QT+=serialport"

+2

FYI:Qtでシリアルポートを使用するために '' QT + = widgets ""は必要ありません。私は常時シリアルポートでアプリケーションを実行しています - 私はウィジェットを必要としないためGUIコンポーネントを常に使用するとは限りません。私は、シリアルポートの問題ではなく、GUI /ウィジェットの問題を抱えていたに違いないと言います。 –

+0

@code_fodderこのコードのコンソールバージョンは問題なく動作しましたが、このGUIバージョンはクラッシュしました。一見すると、 'connected_port = new QSerialPort'行を削除すると、正常に動作するプログラムが生成されるため、シリアルポートの問題であると思いました。しかし、このソリューションを実際のコードで試してみると、親子ウィジェットの関係にはさらなる欠陥が見つかったので、私はあなたに同意するかもしれません。しかし、反対側では、このプログラムがこのようにクラッシュするという不思議な音はしませんか? –

+0

Qtモジュールを追加すると、ビルドディレクトリを完全に削除し、プロジェクトを最初から構築するのに役立ちます。自分のコードとのバイナリの非互換性にぶつかっていた可能性が高いです。 OTOHの場合は、あなたのウィジェットで 'QSerialPort'とUiを値で保持するだけでポインタを使って間接参照を追加する必要はありません:class MainWindow:public QMainWindow {Ui :: MainWindow ui; QSerialPort m_serialPort; ...}; ' –

関連する問題