我想实现一种超时机制,这样如果 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(.