QSerialPort 检测丢失的连接

问题描述

我的设置如下: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;
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)