QSerialPort 检测丢失的连接

时间:2021-03-02 12:24:20

标签: qt arduino raspberry-pi serial-port serial-communication

我的设置如下:Arduino Mega UART3 <--> 电压电平转换器 <--> Rpi4

所有代码都可以找到here

数据以 100 毫秒和 1000 毫秒(取决于数据的重要性)从 Arduino 同步发送到 Rpi。并且数据正在通过 GUI 输入从 Rpi 异步发送回 Arduino(还有一个同步发送时间为 1000 毫秒,以防某些帧丢失/损坏)。

Coms 在与 GUI 不同的线程中处理,以提供最佳用户体验。

好吧,一切正常,但我一直在尝试检测 Rpi 是否与 Arduino 失去连接,但没有成功。 (在另一个方向上覆盖着一个串行看门狗。)

我想避免在 Qt 部分使用另一个看门狗,但我找不到合适的信号来检测丢失的串行连接,因为 QSerialPort 不断随机报告超时错误......并且没有其他方法可以成功检测断开连接。

以下是我尝试使用但没有取得太大成功的解决方法:(可能需要进行重大重写...但我需要先指出正确的方向)

// Serial Port Initialization
    m_Serial = new QSerialPort();
    m_Serial->setPortName("ttyS0");
    //m_Serial->setPortName("ttyUSB0");
    m_Serial->setBaudRate(QSerialPort::Baud115200);
    m_Serial->setDataBits(QSerialPort::Data8);
    m_Serial->setParity(QSerialPort::NoParity);
    m_Serial->setStopBits(QSerialPort::OneStop);
    m_Serial->setFlowControl(QSerialPort::NoFlowControl);
    m_Serial->open(QIODevice::ReadWrite);
    qDebug() << "SerialPort Status: " << m_Serial->isOpen();
    emit serialConnected(m_Serial->isReadable());


    while(!abort)
    {
        QThread::msleep(5);
        while (!isConected(m_Serial)){
            emit serialConnected(false);
            isSerialConected = false;
            QThread::sleep(1);
            qDebug() << "Serial Error: ";
            //qDebug() << "Is readable?: " << m_Serial->isReadable();
            //qDebug() << "Bytes availiable?: " << m_Serial->bytesAvailable();
            mutex.lock();
            abort = _abort;
            mutex.unlock();
        }

        if (!isSerialConected){
        emit serialConnected(true);
        isSerialConected=true;
        }

        mutex.lock();
        abort = _abort;
        mutex.unlock();

        if(!m_outFrameQueue->isEmpty())
        {
            //qDebug() << "Frame empty";
            { *sendData*}

        } else
        {
            if (m_Serial->waitForReadyRead(10) )
            { *readData*}

以及我试图用来检测是否实际连接的函数:

bool SerialWorker::isConected(QSerialPort *m_Serial){
    //    qDebug() << "SerialPort Error: " << m_Serial->error();
    //    qDebug() << "SerialPort isReadable:  " << m_Serial->isReadable();
    //    qDebug() << "SerialPort isReadable:  " << m_Serial->bytesAvailable();
    if (m_Serial->error() == QSerialPort::SerialPortError::NoError){
        return true;
    }
    else if (m_Serial->error() == QSerialPort::SerialPortError::TimeoutError){
        m_Serial->clearError();
        //m_Serial->reset();
        return true;
    }else{
        m_Serial->reset();
        m_Serial->close();
        m_Serial->clearError();
        QThread::sleep(1);
        m_Serial->open(QIODevice::ReadWrite);

        return  false;
    }
}

0 个答案:

没有答案