Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Using QSerialPort in multi widget application
Forum Updated to NodeBB v4.3 + New Features

Using QSerialPort in multi widget application

Scheduled Pinned Locked Moved Unsolved General and Desktop
27 Posts 6 Posters 8.1k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • V viniltc
    22 Mar 2019, 09:44

    @SGaist

    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.

    J Offline
    J Offline
    jsulm
    Lifetime Qt Champion
    wrote on 22 Mar 2019, 10:02 last edited by
    #21

    @viniltc You need to use an instance of tetraSerial class

    https://forum.qt.io/topic/113070/qt-code-of-conduct

    V 1 Reply Last reply 22 Mar 2019, 11:29
    2
    • M mrjj
      21 Mar 2019, 21:45

      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.

      V Offline
      V Offline
      viniltc
      wrote on 22 Mar 2019, 10:58 last edited by
      #22

      @mrjj

      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 write

      Any thoughts?

      1 Reply Last reply
      0
      • J jsulm
        22 Mar 2019, 10:02

        @viniltc You need to use an instance of tetraSerial class

        V Offline
        V Offline
        viniltc
        wrote on 22 Mar 2019, 11:29 last edited by
        #23

        @jsulm

        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.

        J 1 Reply Last reply 22 Mar 2019, 11:37
        0
        • V viniltc
          22 Mar 2019, 11:29

          @jsulm

          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.

          J Offline
          J Offline
          jsulm
          Lifetime Qt Champion
          wrote on 22 Mar 2019, 11:37 last edited by jsulm
          #24

          @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()));
          

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          V 1 Reply Last reply 22 Mar 2019, 15:03
          3
          • J jsulm
            22 Mar 2019, 11:37

            @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()));
            
            V Offline
            V Offline
            viniltc
            wrote on 22 Mar 2019, 15:03 last edited by viniltc
            #25

            @jsulm

            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 my tetraSerial class in a method called serialOpen. Now I want to communicate with for example two forms. When I press Read button in form1 , the data shluld be displayed on a textbox in form 1. In form 2, when I press Write, it shluld write a file into the opened device.

            My confusion where should I define signals and slots and where should I connect them?

            aha_1980A 1 Reply Last reply 22 Mar 2019, 20:29
            0
            • V viniltc
              22 Mar 2019, 15:03

              @jsulm

              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 my tetraSerial class in a method called serialOpen. Now I want to communicate with for example two forms. When I press Read button in form1 , the data shluld be displayed on a textbox in form 1. In form 2, when I press Write, it shluld write a file into the opened device.

              My confusion where should I define signals and slots and where should I connect them?

              aha_1980A Offline
              aha_1980A Offline
              aha_1980
              Lifetime Qt Champion
              wrote on 22 Mar 2019, 20:29 last edited by
              #26

              @viniltc

              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!)

              Qt has to stay free or it will die.

              1 Reply Last reply
              3
              • M Offline
                M Offline
                mrjj
                Lifetime Qt Champion
                wrote on 23 Mar 2019, 09:21 last edited by mrjj
                #27

                Hi

                QObject::connect: No such signal tetraSerial::readyRead() in ..\serialPortTest\mainwindow.cpp:54 QObject::connect: (receiver name: 'MainWindow')

                its the serialObject inside tetraSerial that has the signal so that must be used in the connect

                connect(serial.serialObject, SIGNAL(readyRead()), this, SLOT(serialRecived2()));

                Also, here the tetraSerial serial; is a local variable and will not survive
                long enough to get any data as it will be deleted as soon as constructor ends.
                it should be as a member of MainWindow

                tetraSerial serial; <<< im local. 
                serial.serialOpen();  
                connect(seriall.serialObject, SIGNAL(readyRead()), this, SLOT(serialRecived2()));
                
                1 Reply Last reply
                4

                21/27

                22 Mar 2019, 10:02

                • Login

                • Login or register to search.
                21 out of 27
                • First post
                  21/27
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • Users
                • Groups
                • Search
                • Get Qt Extensions
                • Unsolved