私は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の端末の例でも同様のアプローチですが、なぜ動作するのかわかりませんでした。このコードはそうではありません。どのように動作させる?
これがうまくいかない理由はわかりませんが、いくつかのアプリケーションで同じことをしています。おそらく、次のようにコンストラクタを呼び出すことを試みてください:... = new QSerialPort( "myport"); –
@TheBadgerそれはいい考えですが、うまくいきませんでした(QSerialPortInfoのコンストラクタではありません) –