我想实现一个超时机制,这样如果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
信号连接到一个只打印超时消息并且什么都不做的插槽。
我该如何解决这个问题,以便达到目标?
答案 0 :(得分:3)
您正在使用阻止方法通过串行端口传输数据。 除非您使用线程,否则我认为在执行上一个循环期间无法发送任何其他数据。 顺便说一下:例如,如果Arduino设法在10毫秒内继续发送内容,你的程序将无限期阻止。
添加几个QDebug()<< “我在这”;用于检查代码卡在何处的行;您可能会阻止粘贴在此处的代码之外的某个地方。另一种方法是使用调试器。
如果您尝试发送的上一个'命令'仍然在缓冲区中怎么办?你最终会填充输出缓冲区。在向数据库写入更多数据之前,请检查输出缓冲区中有多少字节。缓冲区应为空。 (qint64 QIODevice :: bytesToWrite()const)。