[NOT SOLVED] QSerialPort 4 Byte Lesen Arduino
-
Hallo Forum,
ich sitze momentan an einem Problem mit QSerialPort und einem Arduino. Ich sende mit dem Arduino an den Serialport eine float zahl (temperatur eines LM35). Dies Funktioniert auch wunderbar (TeraTerm) mit Überprüfung.
Habe dann mit Qt ein Programm geschrieben (google hat geholfen) mit dem ich die Werte einlesen möchte. Nun liest er mir aber das nicht richtig ein. Ich schicke ein float das 4 Bytes besitzt. Angenommen die Temperatur von 27 Grad. Nun liest er die 27 Grad ein und dann mal nur die 2 und anschließend gleich die 7 und dann wieder 5x die 27 und so weiter. --> Lasse ich mir über die Konsole ausgeben.
Ich glaub ich weis auch schon wo mein Fehler ungefähr sitzt:@QByteArray read;
read = serial.readAll();
serial.write(read);@Und zwar sage ich "lies alles". Ich denke hier sitzt der Fehler. Aber weis nicht wie ich sage "lies immer nur die nächsten 4 Byte ein".
Vielleicht kann mir jemand einen Tipp geben.
Gruß
Alex
-
Ich hab zwar keine schöne Lösung gefunden aber zumindest etwas damit ich ein wenig gute werte bekomme.
Ist eher eine Notlösung:@QByteArray reading;
reading = serial.readAll();
serial.write(reading);
if(reading.size() == 4)
emit serialReading(reading);@Natürlich wäre mir lieber wenn ich sagen könnte lies mir die 4 Bytes anstatt schau ob eine größe von 4 ankommt. Vielleicht weis ja einer wie ich das mit Bytes lösen könnte.
Meine Schleife sieht dann folgendermaßen aus:@while(1)
{
if(serial.bytesAvailable() > 0 ||serial.waitForReadyRead(10))
{
QByteArray reading;
reading = serial.readAll();
serial.write(reading);qDebug() << reading.size(); QMutex mutex; mutex.lock(); if(this->Stop) { break; } mutex.unlock(); if(reading.size() == 4) emit serialReading(reading); //this->msleep(1000); } }@
-
Hallo,
habe mal einen Tip versucht:
@QByteArray reading = serial.read(100);
//reading = serial.readAll();
serial.write(reading);@Aber qDebug gibt mir folgendes aus:
MyThread: "24.9"
MyThread: "24"
MyThread: ".9"
MyThread: "24.9"
MyThread: "24."
MyThread: "9"
MyThread: "2"
MyThread: "4.9"
MyThread: "24.9"
MyThread: "24"
MyThread: ".9"
MyThread: "24.9"Er überliest wieder die Bytes. Was genau sind die 100?
Gruß
Alex
-
Hallo,
die serielle Schnittstelle ist eine asynchrone. Es ist nicht festgelegt, in welchem zeitlichen Rahmen die Zeichen eintreffen müssen. Üblicherweise kommen die 4 Zeichen deiner Temperatur schon zusammenhängend, vermutlich mit einer Pause zwischen den einzelnen Werten.
Der Treiber des Betriebssystems interpretiert die Daten aber nicht. Woher soll er wissen, welches Schema hinter den Daten liegt. Immer dann, wenn der Treiber vom Betriebssystem angesprochen wird und Daten im Puffer des Treibers sind, liefert er das was gerade da ist.Dein zweiter Ansatz war schon nicht schlecht. Überprüfe
@if (serial.bytesAvailable() >= 4) @bevor Du in die Auswertung springst und dann lies mit
@serial.read(4);@genau 4 Zeichen aus dem Puffer. Wurden bereits mehr als 4 Zeichen empfangen, bleiben die restlichen Zeichen im Puffer des Treibers.
Armin
-
Wenn die restlichen Zeichen im Puffer bleiben dann kommt alles durcheinander?
-
Nein, da kommt nichts durcheinander. Irgendwann sind wieder mehr als 4 Zeichen im Puffer, dann kann die nächste Zeile ausgelesen werden. Der Treiber macht das schon.