QSerialPort 4 Byte Lesen Arduino

Alles rund um die Programmierung mit Qt
Antworten
nickvan86
Beiträge: 24
Registriert: 8. Oktober 2013 20:26

QSerialPort 4 Byte Lesen Arduino

Beitrag 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
nickvan86
Beiträge: 24
Registriert: 8. Oktober 2013 20:26

Re: QSerialPort 4 Byte Lesen Arduino

Beitrag 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);


        }
    }
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: QSerialPort 4 Byte Lesen Arduino

Beitrag 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.
nickvan86
Beiträge: 24
Registriert: 8. Oktober 2013 20:26

Re: QSerialPort 4 Byte Lesen Arduino

Beitrag 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
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: QSerialPort 4 Byte Lesen Arduino

Beitrag 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?
nickvan86
Beiträge: 24
Registriert: 8. Oktober 2013 20:26

Re: QSerialPort 4 Byte Lesen Arduino

Beitrag 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 :-(
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: QSerialPort 4 Byte Lesen Arduino

Beitrag 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
  }
}
Antworten