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. Why are so many meaningless readyRead() signals being emitted after I open the same serial port multiple times?

Why are so many meaningless readyRead() signals being emitted after I open the same serial port multiple times?

Scheduled Pinned Locked Moved Solved General and Desktop
3 Posts 2 Posters 384 Views 1 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.
  • L Offline
    L Offline
    laplacedoge
    wrote on last edited by laplacedoge
    #1

    Here is a SQerialPort object:

    QSerialPort serialPort;
    

    And I already connected its readyRead() signal with my SLOT readData():

    connect(&serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
    

    And this is what he looks like:

    void SerialPort::readData() {
        QByteArray data = serialPort.readAll();
        cout<<"Data("<<data.length()<<"): "<<data.toStdString()<<endl;
        if(data.length()) {
            recvData.append(data);
            if(recvTimer.isActive()) {
                recvTimer.stop();
            }
            recvTimer.singleShot(100, this, SIGNAL(readReadySignal()));
        }
    }
    

    There is no problem after the first opening of my serial port, because every time the serial port sender send me data and trigger the readyRead() signal, then I got chunks of data after invoking readAll() , but things are getting worse after I close() the serial port and then open() it again, I received the meaningless readyRead() signal because there is no data(the length of the QByteArray is 0 :( ... ) after I invoke readAll().
    After the first opening of serial port:

    Data(21): Hello, QT developers!
    Data(21): Hello, QT developers!
    Data(21): Hello, QT developers!
    Data(21): Hello, QT developers!
    Data(21): Hello, QT developers!
    

    Second opening:

    Data(21): Hello, QT developers!
    Data(0): 
    Data(21): Hello, QT developers!
    Data(0): 
    Data(21): Hello, QT developers!
    Data(0): 
    Data(21): Hello, QT developers!
    Data(0): 
    

    Third opening:

    Data(21): Hello, QT developers!
    Data(0): 
    Data(0): 
    Data(21): Hello, QT developers!
    Data(0): 
    Data(0): 
    Data(21): Hello, QT developers!
    Data(0): 
    Data(0): 
    Data(21): Hello, QT developers!
    Data(0): 
    Data(0): 
    

    Fourth:

    Data(21): Hello, QT developers!
    Data(0): 
    Data(0): 
    Data(0): 
    Data(0): 
    Data(21): Hello, QT developers!
    Data(0): 
    Data(0): 
    Data(0): 
    Data(0): 
    Data(21): Hello, QT developers!
    Data(0): 
    Data(0): 
    Data(0): 
    Data(0):
    

    I didn't invoke readData() from other place, why are so many readyRead() signals being emitted?

    JKSHJ 1 Reply Last reply
    0
    • L laplacedoge

      Here is a SQerialPort object:

      QSerialPort serialPort;
      

      And I already connected its readyRead() signal with my SLOT readData():

      connect(&serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
      

      And this is what he looks like:

      void SerialPort::readData() {
          QByteArray data = serialPort.readAll();
          cout<<"Data("<<data.length()<<"): "<<data.toStdString()<<endl;
          if(data.length()) {
              recvData.append(data);
              if(recvTimer.isActive()) {
                  recvTimer.stop();
              }
              recvTimer.singleShot(100, this, SIGNAL(readReadySignal()));
          }
      }
      

      There is no problem after the first opening of my serial port, because every time the serial port sender send me data and trigger the readyRead() signal, then I got chunks of data after invoking readAll() , but things are getting worse after I close() the serial port and then open() it again, I received the meaningless readyRead() signal because there is no data(the length of the QByteArray is 0 :( ... ) after I invoke readAll().
      After the first opening of serial port:

      Data(21): Hello, QT developers!
      Data(21): Hello, QT developers!
      Data(21): Hello, QT developers!
      Data(21): Hello, QT developers!
      Data(21): Hello, QT developers!
      

      Second opening:

      Data(21): Hello, QT developers!
      Data(0): 
      Data(21): Hello, QT developers!
      Data(0): 
      Data(21): Hello, QT developers!
      Data(0): 
      Data(21): Hello, QT developers!
      Data(0): 
      

      Third opening:

      Data(21): Hello, QT developers!
      Data(0): 
      Data(0): 
      Data(21): Hello, QT developers!
      Data(0): 
      Data(0): 
      Data(21): Hello, QT developers!
      Data(0): 
      Data(0): 
      Data(21): Hello, QT developers!
      Data(0): 
      Data(0): 
      

      Fourth:

      Data(21): Hello, QT developers!
      Data(0): 
      Data(0): 
      Data(0): 
      Data(0): 
      Data(21): Hello, QT developers!
      Data(0): 
      Data(0): 
      Data(0): 
      Data(0): 
      Data(21): Hello, QT developers!
      Data(0): 
      Data(0): 
      Data(0): 
      Data(0):
      

      I didn't invoke readData() from other place, why are so many readyRead() signals being emitted?

      JKSHJ Offline
      JKSHJ Offline
      JKSH
      Moderators
      wrote on last edited by JKSH
      #2

      @laplacedoge said in Why are so many meaningless readyRead() signals being emitted after I open the same serial port multiple times?:

      I didn't invoke readData() from other place, why are so many readyRead() signals being emitted?

      The readyRead() signal is only emitted once, but your readData() slot gets invoked multiple times. This is because you called QObject::connect() multiple times. Each call creates an additional connection.

      The solution? Make sure you only call connect() once, not every time you open the port.

      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

      L 1 Reply Last reply
      4
      • JKSHJ JKSH

        @laplacedoge said in Why are so many meaningless readyRead() signals being emitted after I open the same serial port multiple times?:

        I didn't invoke readData() from other place, why are so many readyRead() signals being emitted?

        The readyRead() signal is only emitted once, but your readData() slot gets invoked multiple times. This is because you called QObject::connect() multiple times. Each call creates an additional connection.

        The solution? Make sure you only call connect() once, not every time you open the port.

        L Offline
        L Offline
        laplacedoge
        wrote on last edited by
        #3

        @JKSH Thanks JKSH, you're are right, I connect() it every time after opening it!

        int SerialPort::open(const QString& portName, int baudrate) {
            serialPort.setPortName(portName);
            if(serialPort.open(QIODevice::ReadWrite))
            {
                serialPort.setBaudRate(baudrate);
                serialPort.setDataBits(QSerialPort::Data8);
                serialPort.setParity(QSerialPort::NoParity);
                serialPort.setStopBits(QSerialPort::OneStop);
                serialPort.setFlowControl(QSerialPort::NoFlowControl);
                connect(&serialPort, SIGNAL(readyRead()), this, SLOT(readData())); // NOOO
                return 0;
            }
            return -1;
        }
        
        1 Reply Last reply
        1

        • Login

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