diff --git a/owlet/owletserialtransport.cpp b/owlet/owletserialtransport.cpp index b66a3e33..3fb28a0b 100644 --- a/owlet/owletserialtransport.cpp +++ b/owlet/owletserialtransport.cpp @@ -20,18 +20,13 @@ OwletSerialTransport::OwletSerialTransport(const QString &serialPortName, uint b m_serialPort->setFlowControl(QSerialPort::FlowControl::NoFlowControl); connect(m_serialPort, &QSerialPort::readyRead, this, &OwletSerialTransport::onReadyRead); - typedef void (QSerialPort:: *errorSignal)(QSerialPort::SerialPortError); - connect(m_serialPort, static_cast(&QSerialPort::error), this, [=](){ - if (m_serialPort->error() != QSerialPort::NoError) { - qCWarning(dcOwlet()) << "Serial port error occured" << m_serialPort->error() << m_serialPort->errorString(); - emit error(); - m_reconnectTimer->start(); - if (m_serialPort->isOpen()) { - m_serialPort->close(); - } - emit connectedChanged(false); - } - }); +#if QT_VERSION < QT_VERSION_CHECK(5, 8, 0) + // NOTE: Using QueuedConnection because in older Qt versions error is emitted before the port says its closed which might end up in a loop... + connect(m_serialPort, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(onError(QSerialPort::SerialPortError)), Qt::QueuedConnection); +#else + connect(m_serialPort, &QSerialPort::errorOccurred, this, &OwletSerialTransport::onError); +#endif + m_reconnectTimer = new QTimer(this); m_reconnectTimer->setInterval(5000); @@ -167,3 +162,16 @@ void OwletSerialTransport::onReadyRead() } } } + +void OwletSerialTransport::onError(QSerialPort::SerialPortError serialPortError) +{ + if (serialPortError != QSerialPort::NoError && serialPortError != QSerialPort::OpenError && m_serialPort->isOpen()) { + qCWarning(dcOwlet()) << "Serial port error occured" << serialPortError << m_serialPort->errorString(); + emit error(); + m_reconnectTimer->start(); + if (m_serialPort->isOpen()) { + m_serialPort->close(); + } + emit connectedChanged(false); + } +} diff --git a/owlet/owletserialtransport.h b/owlet/owletserialtransport.h index 48eed4c5..032088d0 100644 --- a/owlet/owletserialtransport.h +++ b/owlet/owletserialtransport.h @@ -23,6 +23,7 @@ public slots: private slots: void onReadyRead(); + void onError(QSerialPort::SerialPortError serialPortError); private: