QT 中的串行通信超时与 Arduino



我想实现一种超时机制,这样如果 arduino 在一秒钟内没有读取命令,则会导致超时,新命令将被丢弃,程序运行良好。但是现在,如果在执行旧命令期间发送任何新命令,程序将挂起。

这是我代码的超时部分:

QByteArray requestData = myRequest.toLocal8Bit();
    serial.write(requestData);
    if (serial.waitForBytesWritten(waitTime)) {
        if (serial.waitForReadyRead(myWaitTimeout)) {
            QByteArray responseData = serial.readAll();
            while (serial.waitForReadyRead(10))
                responseData += serial.readAll();
            QString response(responseData);
            emit this->response(response);
        } else {
            emit timeout(tr("Wait Read Request Timed Out %1")
                         .arg(QTime::currentTime().toString()));
        }
    } else {
        emit timeout(tr("Wait Write Request Timed Out %1")
                     .arg(QTime::currentTime().toString()));
    }

timeout信号连接到一个插槽,该插槽仅打印超时消息而不执行任何操作。如何解决此问题,以便实现我的目标?

您正在使用阻塞方法通过串行端口传输数据。除非您使用线程,否则我认为在执行上一个循环期间无法发送任何其他数据。顺便说一句:例如,如果Arduino设法在10ms的时间内继续发送内容,您的程序将无限期地阻止。

添加几个QDebug((<<"I'm here";行来检查你的代码卡在哪里;有可能你阻止了你粘贴到这里的代码之外的某个地方。替代方法是使用调试器。

如果您尝试发送的先前"命令"仍在缓冲区中怎么办?您最终将填充输出缓冲区。在向输出缓冲区写入更多数据之前,请使用 QDebug 检查输出缓冲区中有多少字节。缓冲区应为空。(qint64 QIODevice::bytesToWrite(( const(.

相关内容

  • 没有找到相关文章

最新更新