Qdu与Arduino的串行通信超时

时间:2017-06-13 06:37:26

标签: c++ qt arduino timeout

我想实现一个超时机制,这样如果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信号连接到一个只打印超时消息并且什么都不做的插槽。 我该如何解决这个问题,以便达到目标?

1 个答案:

答案 0 :(得分:3)

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

添加几个QDebug()<< “我在这”;用于检查代码卡在何处的行;您可能会阻止粘贴在此处的代码之外的某个地方。另一种方法是使用调试器。

如果您尝试发送的上一个'命令'仍然在缓冲区中怎么办?你最终会填充输出缓冲区。在向数据库写入更多数据之前,请检查输出缓冲区中有多少字节。缓冲区应为空。 (qint64 QIODevice :: bytesToWrite()const)。