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

Code: Alles auswählen

 QByteArray data = port.read(100);
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
  }
}