2017-06-13 2 views
2

Ich möchte einen Timeout-Mechanismus so implementieren, dass, wenn das Arduino den Befehl nicht innerhalb einer Sekunde liest, es zu einem Timeout kommt und der neue Befehl verworfen wird und das Programm gut läuft. Aber jetzt hängt das Programm, wenn ein neuer Befehl während der Ausführung des alten gesendet wird.Serial Communication Timeout in QT mit Arduino

Dies ist der Timeout-Abschnitt meines Code:

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())); 
    } 

Das timeout Signal an einen Schlitz verbunden ist, das nur die Meldung Timeout druckt und tut nichts. Wie kann ich das beheben, damit ich erreichen kann, was ich anvisiere?

+0

Schreiben Sie keinen Code, der 'waitFor'-Methoden verwendet, und Sie werden solche Probleme nicht haben. Für einen möglichen Ansatz, der lesbaren Code bereitstellt und asynchrones Verhalten gut beherrscht, siehe [diese Antwort] (https://stackoverflow.com/a/32595398/1329652). Siehe auch [answer1] (https://stackoverflow.com/a/43703784/1329652), [answer2] (https://stackoverflow.com/a/36437247/1329652) und [answer3] (https: // stackoverflow. com/a/40247676/1329652). –

Antwort

3

Sie verwenden den Blockierungsansatz, um Daten über die serielle Schnittstelle zu übertragen. Sofern Sie keine Threads verwenden, sehe ich keine Möglichkeit, während der Ausführung der vorherigen Schleife zusätzliche Daten zu senden. BTW: Ihr Programm zum Beispiel wird unbegrenzt blockieren, wenn Arduino es schafft, etwas innerhalb von 10ms zu senden.

Ein paar QDebug hinzufügen() < < "Ich bin hier"; Zeilen, um zu überprüfen, wo der Code stecken bleibt; Es ist möglich, dass Sie irgendwo außerhalb von Code blockieren, den Sie hier eingefügt haben. Alternativ kann der Debugger verwendet werden.

Was ist, wenn der vorherige 'Befehl', den Sie senden wollten, noch im Puffer ist? Am Ende füllen Sie den Ausgabepuffer. Überprüfen Sie mit QDebug, wie viele Bytes im Ausgabepuffer sind, bevor Sie weitere Daten darauf schreiben. Puffer sollte leer sein. (qint64 QIODevice :: bytesToWrite() const).