2017-06-13 73 views
2

我想要實現一個超時機制,如果arduino在一秒內沒有讀取命令,它會導致超時,並且新命令被丟棄,程序運行正常。 但是現在,如果在執行舊命令期間發送了任何新命令,程序就會掛起。QT與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

不要編寫任何使用'waitFor'方法的代碼,並且不會有這樣的問題。看到[這個答案](https://stackoverflow.com/a/32595398/1329652)提供了一個可讀的代碼,並很好地處理異步行爲。另請參閱[answer1](https://stackoverflow.com/a/43703784/1329652),[answer2](https://stackoverflow.com/a/36437247/1329652)和[answer3](https:// stackoverflow。 COM /一個/一百三十二萬九千六百五十二分之四千零二十四萬七千六百七十六)。 –

回答

3

您正在使用阻塞方法通過串行端口傳輸數據。 除非你正在使用線程,否則在執行前一個循環期間沒有看到發送任何附加數據的可能性。 順便說一句:例如,如果Arduino設法在10毫秒的時間內發送一些東西,你的程序將無限期地被阻塞。

添加幾個QDebug()< <「我在這裏」;用於檢查代碼卡住的位置;您可能會阻止您在此處粘貼代碼的地方。另一種方法是使用調試器。

如果您之前嘗試發送的'command'仍然在緩衝區中,該怎麼辦?你將最終填充輸出緩衝區。在向其寫入更多數據之前,請使用QDebug檢查輸出緩衝區中有多少個字節。緩衝區應該是空的。 (qint64 QIODevice :: bytesToWrite()const)。