ich sitze schon eine Weile an dem Problem mit Qt ein Programm zu schreiben welches mir die Serielle Schnittstelle ausliest und die gelesenen Daten verarbeitet. Ich hab das ganze Programm in einem Thread gelöst allerdings hat das Programm ein paar Pakete verschluckt (wahrscheinlich beim erstellen der GUi und so).
Nun versuche ich es mit einem zweiten Thread zu lösen aber ich schaff es einfach nicht meine Variable aus Thread 1 dem 2. zu übergeben. Ich steh auf dem Schlauch kann mir bitte einer weiterhelfen und vllt Tipps geben was man an meinem Programm besser machen kann? Ich bin neu in der C++ und GUI Entwicklung.
Hier ist die Fehler Ausgabe:
Code: Alles auswählen
QObject::connect: No such signal QThread::dataRead() in ..\test_serial\mainwindow.cpp:15
QObject::connect: (receiver name: 'MainWindow')
main.cpp
Code: Alles auswählen
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Code: Alles auswählen
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "worker.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
worker *mWorker = new worker;
mWorker->moveToThread(&mThread);
mWorker->initPort();
connect(&mThread,SIGNAL(finished()),mWorker,SLOT(deleteLater()));
connect(&mThread,SIGNAL(dataRead()),this,SLOT(protokoll())); // Ich glaube hier liegt mein Fehler??
mThread.start();
}
MainWindow::~MainWindow()
{
mThread.quit();
mThread.wait();
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
}
void MainWindow::protokoll(QByteArray datas){
qDebug() << datas; // Hier kommt nichts an...
}
Code: Alles auswählen
#include "worker.h"
#include <QDebug>
worker::worker(QObject *parent) : QObject(parent){
}
worker::~worker()
{
delete portCom;
portCom=NULL;
}
void worker::initPort()
{
if(portCom==NULL){
portCom = new QSerialPort;
portCom->setBaudRate(QSerialPort::Baud115200);
portCom->setDataBits(QSerialPort::Data8);
portCom->setParity(QSerialPort::NoParity);
portCom->setStopBits(QSerialPort::OneStop);
portCom->setFlowControl(QSerialPort::NoFlowControl);
}
if(portCom->isOpen()) portCom->close();
portCom->setPortName("COM6");
if(portCom->open(QSerialPort::ReadWrite)){
connect(portCom, &QSerialPort::readyRead, this, &worker::readData);
}
else
qDebug() << "Port Open Failure";
}
void worker::readData()
{
datas=(portCom->readAll().toHex());
emit dataRead(datas);
qDebug() << datas.mid(2,2).toInt(0,16); //Counter - Position
}
Code: Alles auswählen
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
QThread mThread;
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void on_pushButton_clicked();
void protokoll(QByteArray);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Code: Alles auswählen
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
#include <QThread>
#include <QtSerialPort/QSerialPort>
class worker : public QObject
{
Q_OBJECT
QSerialPort* portCom=NULL;
public:
explicit worker(QObject *parent = 0);
~worker();
signals:
void dataRead(QByteArray);
public slots:
void initPort();
void readData();
private:
QByteArray datas;
};
#endif // WORKER_H