Using QSerialPort in multi widget application
-
@mrjj
thanks for your response. Sorry I didn't get your point. What is MainWindowInstancePointer in my case? This is my mainwindow.h#include <QMainWindow> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); QSerialPort *serial1; private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
And this is mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui1(new Ui::MainWindow) { ui->setupUi(this); serial1 = new QSerialPort(); serial1->setPortName("com5"); serial1->setBaudRate(1000000); // baudrate 1000000 ..1M serial1->setDataBits(QSerialPort::Data8); serial1->setParity(QSerialPort::NoParity); serial1->setStopBits(QSerialPort::OneStop); serial1->setFlowControl(QSerialPort::HardwareControl); //Hardware flow control (RTS/CTS), NoFlowControl, SoftwareControl serial1->open(QIODevice::ReadWrite); // connect(serial1, SIGNAL(readyRead()), this, SLOT(serialRecived())); } MainWindow::~MainWindow() { delete ui1; }
Or you could move serial to its own class and both mainwindow and OtherClass could use it via signals.
in that I'd put it into its own class file. Though I don't think you then need to communicate with it via signals, that may be a bit more work then you're used to. To me, your serial port object just does not particularly belong as a member of your
MainWindow
(either instance or class) at all.What is MainWindowInstancePointer in my case? This is my mainwindow.h
It's your
public QSerialPort *serial1;
. Following what I've said above, because you're making yourQSerialPort
a member of yourMainWindow
instance that would mean your other module needs to find & access the current main window instance in order to access that object.To make what you've currently work dirtily without doing that, make your declaration (
.h
file) and definition (.cpp
file) havestatic
(I don't do C++ daily so I don't offer the exact code). That will allow you to access it from the other module viaMainWindow::serial
. [I assume you just have typos where sometimes your variable is namedserial
and sometimesserial1
.]I still don't recommend this actual way of doing it,
static
is not great these days. My thought as I said would be singleton class/object. -
Hi,
As my fellows already wrote: don't implement it that way. You should first explain what exactly your other widgets are going to do with the serial port.
-
Hi,
As per the previous suggestion I was trying to create a singleton class for my serial port module. I have one serial port that needs to be able to read and write in multiple forms.My serial module class as follows :
#include "tetraserial.h" tetraSerial::tetraSerial(QObject *parent) : QObject(parent) { serialObject = new QSerialPort(); serialObject->setPortName("com5"); serialObject->setBaudRate(1000000); serialObject->setDataBits(QSerialPort::Data8); serialObject->setParity(QSerialPort::NoParity); serialObject->setStopBits(QSerialPort::OneStop); serialObject->setFlowControl(QSerialPort::HardwareControl); / serialObject->open(QIODevice::ReadWrite); }
and my serial.h as follows
#ifndef TETRASERIAL_H #define TETRASERIAL_H #include <QObject> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> class tetraSerial : public QObject { Q_OBJECT public: explicit tetraSerial(QObject *parent = nullptr); static QSerialPort *serialObject; signals: public slots: }; #endif // TETRASERIAL_H
I was trying to access serialObject from MainWindow as follows:
connect(tetraSerial::serialObject, SIGNAL(readyRead()), this, SLOT(serialRecived()))
I'm getting an error saying undefined refernce to 'tetraSerial::serialObject'
what I'm doing wrong here?
-
Hi,
As per the previous suggestion I was trying to create a singleton class for my serial port module. I have one serial port that needs to be able to read and write in multiple forms.My serial module class as follows :
#include "tetraserial.h" tetraSerial::tetraSerial(QObject *parent) : QObject(parent) { serialObject = new QSerialPort(); serialObject->setPortName("com5"); serialObject->setBaudRate(1000000); serialObject->setDataBits(QSerialPort::Data8); serialObject->setParity(QSerialPort::NoParity); serialObject->setStopBits(QSerialPort::OneStop); serialObject->setFlowControl(QSerialPort::HardwareControl); / serialObject->open(QIODevice::ReadWrite); }
and my serial.h as follows
#ifndef TETRASERIAL_H #define TETRASERIAL_H #include <QObject> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> class tetraSerial : public QObject { Q_OBJECT public: explicit tetraSerial(QObject *parent = nullptr); static QSerialPort *serialObject; signals: public slots: }; #endif // TETRASERIAL_H
I was trying to access serialObject from MainWindow as follows:
connect(tetraSerial::serialObject, SIGNAL(readyRead()), this, SLOT(serialRecived()))
I'm getting an error saying undefined refernce to 'tetraSerial::serialObject'
what I'm doing wrong here?
@viniltc
With the usual proviso that my C++ is shaky, and I'm not sure whether it could cause the error if it's against theconnect()
line as opposed to from the linker, but: you do not show, but in yourtetraserial.cpp
(not.h
) have you placed the definitionstatic QSerialPort *tetraSerial::serialObject;
somewhere? -
@JonB said in Using QSerialPort in multi widget application:
static QSerialPort *tetraSerial::serialObject;
@JonB
The error is thrown from themainWindow.cpp
Also, I can't place
static QSerialPort *tetraSerial::serialObject;
in the class definition intetraserial.h
either ; it says extra qualification on member 'serialObject'Any thought!?
-
@JonB said in Using QSerialPort in multi widget application:
static QSerialPort *tetraSerial::serialObject;
@JonB
The error is thrown from themainWindow.cpp
Also, I can't place
static QSerialPort *tetraSerial::serialObject;
in the class definition intetraserial.h
either ; it says extra qualification on member 'serialObject'Any thought!?
@viniltc
I did state that line was specifically not to be put intetraserial.h
, it belongs intetraserial.cpp
if you do not already have it there.I don't know now about your error in
mainWindow.cpp
--- unless you have failed to includetetraSerial.h
there, you wouldn't have failed to do that would you?? -
I modified the .cpp file as follows:
#include "tetraserial.h" QSerialPort *tetraSerial::serialObject; tetraSerial::tetraSerial(QObject *parent) : QObject(parent) { serialObject = new QSerialPort(this); serialObject->setPortName("com5"); serialObject->setBaudRate(1000000); serialObject->setDataBits(QSerialPort::Data8); serialObject->setParity(QSerialPort::NoParity); serialObject->setStopBits(QSerialPort::OneStop); serialObject->setFlowControl(QSerialPort::HardwareControl); serialObject->open(QIODevice::ReadWrite); }
I can't define
QSerialPort *tetraSerial::serialObject
as static because it is allowed only inside the class definition.Now It is building but I'm getting a runtime error, it says in the console:
cannot connect <null>::readyReady() Mainwindow::serialRecived
my connect statement in the main as follows:
connect(tetraSerial::serialObject, SIGNAL(readyRead()), this, SLOT(serialRecived()));
Any suggestion??
-
I modified the .cpp file as follows:
#include "tetraserial.h" QSerialPort *tetraSerial::serialObject; tetraSerial::tetraSerial(QObject *parent) : QObject(parent) { serialObject = new QSerialPort(this); serialObject->setPortName("com5"); serialObject->setBaudRate(1000000); serialObject->setDataBits(QSerialPort::Data8); serialObject->setParity(QSerialPort::NoParity); serialObject->setStopBits(QSerialPort::OneStop); serialObject->setFlowControl(QSerialPort::HardwareControl); serialObject->open(QIODevice::ReadWrite); }
I can't define
QSerialPort *tetraSerial::serialObject
as static because it is allowed only inside the class definition.Now It is building but I'm getting a runtime error, it says in the console:
cannot connect <null>::readyReady() Mainwindow::serialRecived
my connect statement in the main as follows:
connect(tetraSerial::serialObject, SIGNAL(readyRead()), this, SLOT(serialRecived()));
Any suggestion??
-
There's no need to make your serial port static.
You don't check whether the
open
call was successful. -
hI
Also, im a little concerned by sharing the serial idea.
Its fine for writing to it, however, if you connect say 3 other classed to
readyRead() signal, they all get the signal but whom of them will then read the data ?
and how will you know if that class was the intended receiver of the data?It would help if you explained more what the app does and its intended design.
-
There's no need to make your serial port static.
You don't check whether the
open
call was successful.If it's non-static, I'm getting an error saying invalid use of non-static data member 'serialObject
The program is getting crashed from the mainWindow itself
connect(tetraSerial::serialObject, SIGNAL(readyRead()), this, SLOT(serialRecived()));
Can't find what's wrong with my class definition.
-
If it's non-static, I'm getting an error saying invalid use of non-static data member 'serialObject
The program is getting crashed from the mainWindow itself
connect(tetraSerial::serialObject, SIGNAL(readyRead()), this, SLOT(serialRecived()));
Can't find what's wrong with my class definition.
-
hI
Also, im a little concerned by sharing the serial idea.
Its fine for writing to it, however, if you connect say 3 other classed to
readyRead() signal, they all get the signal but whom of them will then read the data ?
and how will you know if that class was the intended receiver of the data?It would help if you explained more what the app does and its intended design.
It is a GUI to communicate with an FTDI based serial device.
-
There will be setup stages having three windows. At the end of setup, the GUI should send a 'config file' to the serial device (say CPU -A)
-
During those setup stages, GUI should also read the serial device to get real-time updates of some sensors connected to the device (CPU-B). Also writing to some registers of the device.
-
For example, I have three windows - window1, window2, window3. The 'config file' will be sent at window 3. The user will be seeing some sensor values in window2 and updating its parameters by writing into some short registers.
All the above operations will be done through a single FTDI based serial (UART).
So what I need is to get an instance of opened serial port' in any of those windows to read or writeAny thoughts?
-
-
I try to modify the
class file
as follows:#include "tetraserial.h" tetraSerial::tetraSerial(QObject *parent) : QObject(parent) { } void tetraSerial::serialOpen() { serialObject = new QSerialPort(); serialObject->setPortName("com5"); serialObject->setBaudRate(1000000); serialObject->setDataBits(QSerialPort::Data8); serialObject->setParity(QSerialPort::NoParity); serialObject->setStopBits(QSerialPort::OneStop); serialObject->setFlowControl(QSerialPort::HardwareControl); serialObject->open(QIODevice::ReadWrite); } void tetraSerial::serialRecived2() { }
and the
header
as follows:#ifndef TETRASERIAL_H #define TETRASERIAL_H #include <QObject> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> #include <QFile> #include <QMessageBox> class tetraSerial : public QObject { Q_OBJECT public: explicit tetraSerial(QObject *parent = nullptr); // static QSerialPort *serialObject; QSerialPort *serialObject; void serialOpen() signals: public slots: void serialRecived2(); };
Then I use this in the
main
as:MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); tetraSerial serial; serial.serialOpen(); connect(serial, SIGNAL(readyRead()), this, SLOT(serialRecived2())); }
I've got an error says:
no matching member function for call to 'connect'
I don't understand why the
connect
function can't find a matching function. -
I try to modify the
class file
as follows:#include "tetraserial.h" tetraSerial::tetraSerial(QObject *parent) : QObject(parent) { } void tetraSerial::serialOpen() { serialObject = new QSerialPort(); serialObject->setPortName("com5"); serialObject->setBaudRate(1000000); serialObject->setDataBits(QSerialPort::Data8); serialObject->setParity(QSerialPort::NoParity); serialObject->setStopBits(QSerialPort::OneStop); serialObject->setFlowControl(QSerialPort::HardwareControl); serialObject->open(QIODevice::ReadWrite); } void tetraSerial::serialRecived2() { }
and the
header
as follows:#ifndef TETRASERIAL_H #define TETRASERIAL_H #include <QObject> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> #include <QFile> #include <QMessageBox> class tetraSerial : public QObject { Q_OBJECT public: explicit tetraSerial(QObject *parent = nullptr); // static QSerialPort *serialObject; QSerialPort *serialObject; void serialOpen() signals: public slots: void serialRecived2(); };
Then I use this in the
main
as:MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); tetraSerial serial; serial.serialOpen(); connect(serial, SIGNAL(readyRead()), this, SLOT(serialRecived2())); }
I've got an error says:
no matching member function for call to 'connect'
I don't understand why the
connect
function can't find a matching function. -
@viniltc What is serial in
connect(serial, SIGNAL(readyRead()), this, SLOT(serialRecived2()));
?
It needs to be a pointer:connect(&serial, SIGNAL(readyRead()), this, SLOT(serialRecived2()));
I'm getting a runtime error saying
QObject::connect: No such signal tetraSerial::readyRead() in ..\serialPortTest\mainwindow.cpp:54 QObject::connect: (receiver name: 'MainWindow')
I already configured the serial port in the
tetraSerial
class as shown above. What might be the cause?Also
I'm a bit confused about where to define signals and slots. As you can see I've opened the device in mytetraSerial
class in a method calledserialOpen
. Now I want to communicate with for example two forms. When I pressRead
button in form1 , the data shluld be displayed on a textbox in form 1. In form 2, when I pressWrite
, it shluld write a file into the opened device.My confusion where should I define signals and slots and where should I connect them?
-
I'm getting a runtime error saying
QObject::connect: No such signal tetraSerial::readyRead() in ..\serialPortTest\mainwindow.cpp:54 QObject::connect: (receiver name: 'MainWindow')
I already configured the serial port in the
tetraSerial
class as shown above. What might be the cause?Also
I'm a bit confused about where to define signals and slots. As you can see I've opened the device in mytetraSerial
class in a method calledserialOpen
. Now I want to communicate with for example two forms. When I pressRead
button in form1 , the data shluld be displayed on a textbox in form 1. In form 2, when I pressWrite
, it shluld write a file into the opened device.My confusion where should I define signals and slots and where should I connect them?
My confusion where should I define signals and slots and where should I connect them?
- signals: in the sender
- slots: in the receiver
- connect: in a class that knows both other classes or in the receiver (but not in the sender!)