Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. [NOT SOLVED] QSerialPort 4 Byte Lesen Arduino
Forum Updated to NodeBB v4.3 + New Features

[NOT SOLVED] QSerialPort 4 Byte Lesen Arduino

Scheduled Pinned Locked Moved German
6 Posts 2 Posters 2.9k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • N Offline
    N Offline
    nickvan86
    wrote on last edited by
    #1

    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

    Qt 5.2.1 Creator 3.0.1 Windows 7 64bit

    1 Reply Last reply
    0
    • N Offline
      N Offline
      nickvan86
      wrote on last edited by
      #2

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

      Qt 5.2.1 Creator 3.0.1 Windows 7 64bit

      1 Reply Last reply
      0
      • N Offline
        N Offline
        nickvan86
        wrote on last edited by
        #3

        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

        Qt 5.2.1 Creator 3.0.1 Windows 7 64bit

        1 Reply Last reply
        0
        • L Offline
          L Offline
          LordOfBikes
          wrote on last edited by
          #4

          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

          1 Reply Last reply
          0
          • N Offline
            N Offline
            nickvan86
            wrote on last edited by
            #5

            Wenn die restlichen Zeichen im Puffer bleiben dann kommt alles durcheinander?

            Qt 5.2.1 Creator 3.0.1 Windows 7 64bit

            1 Reply Last reply
            0
            • L Offline
              L Offline
              LordOfBikes
              wrote on last edited by
              #6

              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.

              1 Reply Last reply
              0

              • Login

              • Login or register to search.
              • First post
                Last post
              0
              • Categories
              • Recent
              • Tags
              • Popular
              • Users
              • Groups
              • Search
              • Get Qt Extensions
              • Unsolved