Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QByteArray to float
Forum Updated to NodeBB v4.3 + New Features

QByteArray to float

Scheduled Pinned Locked Moved Unsolved General and Desktop
14 Posts 5 Posters 13.2k Views 3 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.
  • K Offline
    K Offline
    kuzulis
    Qt Champions 2020
    wrote on last edited by kuzulis
    #5
    QDataStream in(serial, QIODevice::ReadOnly);
    float value;
    in >> value;
    
    kshegunovK 1 Reply Last reply
    0
    • K kuzulis
      QDataStream in(serial, QIODevice::ReadOnly);
      float value;
      in >> value;
      
      kshegunovK Offline
      kshegunovK Offline
      kshegunov
      Moderators
      wrote on last edited by kshegunov
      #6

      @kuzulis
      Is this blocking (I'm curious for myself)?

      PS.
      Btw, he's sending it as a string. :)

      Read and abide by the Qt Code of Conduct

      1 Reply Last reply
      0
      • K Offline
        K Offline
        kuzulis
        Qt Champions 2020
        wrote on last edited by kuzulis
        #7

        It is just a simple example.. But real example it is something:

        void Foo::onReadyRead()
        {
            while (serial->bytesAvailable() >= 4) { // or, maybe QSataStream::atEnd()
                QDataStream in(serial);
                float value;
                in >> value;
            }
        }
        

        But, anyway, need to use serial->bytesAvailable() to control a number of received bytes, before reading.

        Is this blocking (I'm curious for myself)?

        No, why should it be blocking?

        PS: It is just an additional way to @Wieland 's example.

        Btw, he's sending it as a string. :)

        Ahh, ok. :)

        kshegunovK 1 Reply Last reply
        1
        • K kuzulis

          It is just a simple example.. But real example it is something:

          void Foo::onReadyRead()
          {
              while (serial->bytesAvailable() >= 4) { // or, maybe QSataStream::atEnd()
                  QDataStream in(serial);
                  float value;
                  in >> value;
              }
          }
          

          But, anyway, need to use serial->bytesAvailable() to control a number of received bytes, before reading.

          Is this blocking (I'm curious for myself)?

          No, why should it be blocking?

          PS: It is just an additional way to @Wieland 's example.

          Btw, he's sending it as a string. :)

          Ahh, ok. :)

          kshegunovK Offline
          kshegunovK Offline
          kshegunov
          Moderators
          wrote on last edited by kshegunov
          #8

          @kuzulis

          No, why should it be blocking?

          I'm not saying it should be; I was simply asking if it waits for the 4 bytes, or it tries to read them directly from the buffer. Non-blocking is just fine with me. :)

          Read and abide by the Qt Code of Conduct

          1 Reply Last reply
          0
          • K Offline
            K Offline
            kuzulis
            Qt Champions 2020
            wrote on last edited by kuzulis
            #9

            Btw, he's sending it as a string. :)

            Then he need to add a '\n' after each string value, to allow to parse it correctly. Then need to use @Wieland 's solution. Or, maybe QTextStream.

            1 Reply Last reply
            0
            • V Offline
              V Offline
              valerio.j
              wrote on last edited by
              #10

              Wielands solution worked for me.

              Now I have another question.

              Sending data from the Qt App. This results in an error, it only works if chkTstr24VDC was a QBytearray which I can deal with, but I'm trying to understand why it won't work with QString. Below is the error. Maybe I need to convert QString to QBytearray??

              error: no matching function for call to 'QSerialPort::write(QString&)'
              serial->write(chkTstr24VDC);
              ^

              void MainWindow::on_powerON_clicked()
              {
                   int res;
              
                  QString chkTstr24VDC ("$AR!ARP022#");
              
                   serial->write(chkTstr24VDC);
                   res = readADC(24);                                  //Read and test 24VDC range
              }
              
              
              1 Reply Last reply
              0
              • mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by mrjj
                #11

                Hi
                the write expects a const char *
                To get that from Q String you can do

                serial->write(text.toStdString().c_str());

                http://doc.qt.io/qt-5/qiodevice.html#write
                or use bytearray/ convert to.

                kshegunovK 1 Reply Last reply
                0
                • mrjjM mrjj

                  Hi
                  the write expects a const char *
                  To get that from Q String you can do

                  serial->write(text.toStdString().c_str());

                  http://doc.qt.io/qt-5/qiodevice.html#write
                  or use bytearray/ convert to.

                  kshegunovK Offline
                  kshegunovK Offline
                  kshegunov
                  Moderators
                  wrote on last edited by
                  #12

                  @valerio-j

                  Maybe I need to convert QString to QBytearray??

                  Yes, indeed you need to do that. Also you need to be sure the port is ready after writing/before reading.

                  QByteArray chkTstr24VDC = QByteArrayLiteral("$AR!ARP022#");
                  
                  serial->write(chkTstr24VDC);
                  serial->waitForBytesWritten(1000); //< Wait up to a second so the data is written to the port
                  
                  serial->waitForReadyRead(1000);  //< Wait up to a second so the port is ready for reading
                  res = readADC(24);                                  // Read and test 24VDC range
                  

                  @mrjj said:

                  To get that from Q String you can do
                  serial->write(text.toStdString().c_str());

                  But you shouldn't, you should rather enforce the encoding with toLatin1, toUtf8 or alike, and get a byte array from there. Then this byte array can be sent through the serial port. For example:

                  QString myStringData("some string data");
                  QByteArray byteArrayData = myStringData.toLatin1();
                  
                  serial->write(byteArrayData);
                  

                  Read and abide by the Qt Code of Conduct

                  1 Reply Last reply
                  2
                  • V Offline
                    V Offline
                    valerio.j
                    wrote on last edited by
                    #13

                    @kshegunov said:

                    serial->waitForReadyRead(1000);

                    Thanks, this really improved my program, but it doesn't work 100% yet. Sometimes it combines both reads into a single string when using back to back write/reads. Below is what my code looks like now. I've tried with longer delays, but it doesn't help.

                    void MainWindow::on_powerON_clicked()
                    {
                        int res24, res3v3;
                        QPixmap stat_GO (":/res/images/stat_GO.png");
                        QPixmap stat_noGO (":/res/images/stat_noGO.png");
                    
                        QByteArray chkTstr24VDC ("$AR!ARP022#");
                        QByteArray chkBUT3_3VDC ("$AR^ARP032#");
                    
                        QByteArray powerON ("$DW!SHP079#");
                        QByteArray kill ("$DW!SHP004#");
                        QByteArray pwr_switch ("$DW!SLP058#");
                    
                        sndTesterData(powerON);                     //Enable 24VDC
                        sndTesterData(chkTstr24VDC);                //Request 24VDC status to Tester
                    
                        serial->waitForReadyRead(1000);
                        res24 = readADC(24);
                    
                        if(res24 == 1)
                        {
                        sndTesterData(kill);                        //E-OFF
                        sndTesterData(pwr_switch);                  //On/Off Switch
                        ui->_tstr24Vok->setPixmap(stat_GO);
                    
                            sndTesterData(chkBUT3_3VDC);
                            serial->waitForReadyRead(1000);
                            res3v3 = readADC(3);
                    
                            if(res3v3 == 1)
                                ui->_but3v3Vok->setPixmap(stat_GO);
                                    else
                                    ui->_but3v3Vok->setPixmap(stat_noGO);
                        }
                        else
                        ui->_tstr24Vok->setPixmap(stat_noGO);
                    
                    }
                    
                    kshegunovK 1 Reply Last reply
                    0
                    • V valerio.j

                      @kshegunov said:

                      serial->waitForReadyRead(1000);

                      Thanks, this really improved my program, but it doesn't work 100% yet. Sometimes it combines both reads into a single string when using back to back write/reads. Below is what my code looks like now. I've tried with longer delays, but it doesn't help.

                      void MainWindow::on_powerON_clicked()
                      {
                          int res24, res3v3;
                          QPixmap stat_GO (":/res/images/stat_GO.png");
                          QPixmap stat_noGO (":/res/images/stat_noGO.png");
                      
                          QByteArray chkTstr24VDC ("$AR!ARP022#");
                          QByteArray chkBUT3_3VDC ("$AR^ARP032#");
                      
                          QByteArray powerON ("$DW!SHP079#");
                          QByteArray kill ("$DW!SHP004#");
                          QByteArray pwr_switch ("$DW!SLP058#");
                      
                          sndTesterData(powerON);                     //Enable 24VDC
                          sndTesterData(chkTstr24VDC);                //Request 24VDC status to Tester
                      
                          serial->waitForReadyRead(1000);
                          res24 = readADC(24);
                      
                          if(res24 == 1)
                          {
                          sndTesterData(kill);                        //E-OFF
                          sndTesterData(pwr_switch);                  //On/Off Switch
                          ui->_tstr24Vok->setPixmap(stat_GO);
                      
                              sndTesterData(chkBUT3_3VDC);
                              serial->waitForReadyRead(1000);
                              res3v3 = readADC(3);
                      
                              if(res3v3 == 1)
                                  ui->_but3v3Vok->setPixmap(stat_GO);
                                      else
                                      ui->_but3v3Vok->setPixmap(stat_noGO);
                          }
                          else
                          ui->_tstr24Vok->setPixmap(stat_noGO);
                      
                      }
                      
                      kshegunovK Offline
                      kshegunovK Offline
                      kshegunov
                      Moderators
                      wrote on last edited by
                      #14

                      @valerio.j said:

                      Thanks, this really improved my program, but it doesn't work 100% yet. Sometimes it combines both reads into a single string when using back to back write/reads.

                      This is not unexpected. There's buffering involved and there's no guarantee (as with TCP) that anything you write will be read as a separate packet. You need to ensure that the way you're sending the data is taking this into account (usually by using a protocol).

                      Read and abide by the Qt Code of Conduct

                      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