Seite 1 von 1
QSerialPort 4 Byte Lesen Arduino
Verfasst: 6. Juli 2014 19:31
von nickvan86
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:
Code: Alles auswählen
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
Re: QSerialPort 4 Byte Lesen Arduino
Verfasst: 6. Juli 2014 22:43
von nickvan86
Ich hab zwar keine schöne Lösung gefunden aber zumindest etwas damit ich ein wenig gute werte bekomme.
Ist eher eine Notlösung:
Code: Alles auswählen
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:
Code: Alles auswählen
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);
}
}
Re: QSerialPort 4 Byte Lesen Arduino
Verfasst: 6. Juli 2014 23:10
von veeman
Schau dir die Doku an:
http://qt-project.org/doc/qt-5/qserialport.html
PS: Du kannst auch die Signale der Elternklasse verwenden.
Re: QSerialPort 4 Byte Lesen Arduino
Verfasst: 6. Juli 2014 23:37
von nickvan86
Hallo,
habe mal deinen Tip versucht:
Code: Alles auswählen
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 was du bei Read angegeben hast?
Gruß
Alex
Re: QSerialPort 4 Byte Lesen Arduino
Verfasst: 8. Juli 2014 09:25
von veeman
Oo, die Zahl war ein Beispiel und gibt an wieviele Bytes er einlesen soll. In deinem Fall sollte es 4 sein.
//Edit: Kann es sein dass du die Werte als Ascii sendest?
Re: QSerialPort 4 Byte Lesen Arduino
Verfasst: 8. Juli 2014 12:15
von nickvan86
Hallo,
ich sende es als 4 byte:
Code: Alles auswählen
float temperatur = 27.8;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.write((byte*)&temperatur, 4);
delay(1000);
}
Und wenn ich dein Beispiel nehme:
Code: Alles auswählen
if(serial.bytesAvailable() >= 4 ) //||serial.waitForReadyRead(10)
{
// QByteArray reading = serial.readAll();
// serial.write(reading);
// qDebug() << reading;
unsigned char data[4];
serial.readData(data, 4);
Kommen folgende Fehlermeldungen:
C:\Qt\5.2.1\mingw48_32\include\QtSerialPort\qserialport.h:269: error: 'virtual qint64 QSerialPort::readData(char*, qint64)' is protected
qint64 readData(char *data, qint64 maxSize) Q_DECL_OVERRIDE;
^
C:\Users\********\Desktop\ServerLog\mythread.cpp:32: error: within this context
serial.readData(data, 4);
^
C:\Users\********\Desktop\ServerLog\mythread.cpp:32: error: invalid conversion from 'unsigned char*' to 'char*' [-fpermissive]
Hab auch schon versucht nicht mit unsigned aber mag er auch nicht

Re: QSerialPort 4 Byte Lesen Arduino
Verfasst: 9. Juli 2014 13:43
von veeman
Check this:
Code: Alles auswählen
if (serial.waitForReadyRead(100))
{
while(serial.bytesAvailable() >= 4)
{
QByteArray data = serial.read(4);
// tue was mit data
// oder direkt, insofern die float Repräsentation identisch ist
float value = 0;
serial.read((char*)&value, 4);
// tu was mit value
}
}