Why are so many meaningless readyRead() signals being emitted after I open the same serial port multiple times?
-
Here is a
SQerialPortobject:QSerialPort serialPort;And I already connected its
readyRead()signal with my SLOTreadData():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 invokingreadAll(), but things are getting worse after Iclose()the serial port and thenopen()it again, I received the meaninglessreadyRead()signal because there is no data(the length of the QByteArray is 0 :( ... ) after I invokereadAll().
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 manyreadyRead()signals being emitted? -
Here is a
SQerialPortobject:QSerialPort serialPort;And I already connected its
readyRead()signal with my SLOTreadData():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 invokingreadAll(), but things are getting worse after Iclose()the serial port and thenopen()it again, I received the meaninglessreadyRead()signal because there is no data(the length of the QByteArray is 0 :( ... ) after I invokereadAll().
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 manyreadyRead()signals being emitted?@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 manyreadyRead()signals being emitted?The
readyRead()signal is only emitted once, but yourreadData()slot gets invoked multiple times. This is because you calledQObject::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. -
@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 manyreadyRead()signals being emitted?The
readyRead()signal is only emitted once, but yourreadData()slot gets invoked multiple times. This is because you calledQObject::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.@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; }