2017-06-13 28 views
2

arduinoが1秒以内にコマンドを読み込まないとタイムアウトになり、新しいコマンドが破棄されてプログラムが正常に動作するようなタイムアウトメカニズムを実装したいと考えています。 今のところ、新しいコマンドが古いコマンドの実行中に送信されると、プログラムはハングします。ArduinoとのQTでのシリアル通信タイムアウト

これは私のコードのタイムアウトセクションである:

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'メソッドを使用するコードを記述しないでください。このような問題はありません。読解可能なコードを提供し、非同期動作にうまく対処するための1つの可能なアプローチについては、[この回答](https://stackoverflow.com/a/32595398/1329652)を参照してください。 [回答1](https://stackoverflow.com/a/43703784/1329652)、[回答2](https://stackoverflow.com/a/36437247/1329652)、[回答3](https:// stackoverflow。 com/a/40247676/1329652)。 –

答えて

3

シリアルポート経由でデータを送信するためにブロッキング方式を使用しています。 スレッドを使用していない限り、以前のループの実行中に追加のデータを送信する可能性はありません。 BTW:Arduinoが10ms以内に何かを送信し続けると、あなたのプログラムは無期限にブロックされます。

QDebug()のカップルを追加します。< <「私はここにいる」;コードが滞っている場所を確認するための行。ここに貼り付けたコードの外側をブロックしている可能性があります。別の方法として、デバッガを使用する方法があります。

送信しようとしていた以前の「コマンド」がまだバッファに入っている場合はどうなりますか?出力バッファをいっぱいにします。より多くのデータを書き込む前に、QDebugで出力バッファ内のバイト数を確認してください。バッファは空にする必要があります。 (qint64 QIODevice :: bytesToWrite()const)。

関連する問題