Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. How we can read particular string/data from any device to print on particular LCD in qt?

How we can read particular string/data from any device to print on particular LCD in qt?

Scheduled Pinned Locked Moved Solved Mobile and Embedded
qtcreatorqtwidgetsqt5.5qt4read serial
25 Posts 5 Posters 10.0k Views
  • 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.
  • S SGaist
    24 Mar 2018, 22:06

    Hi,

    Because as already written in another thread you are not handling the data from your serial port correctly. You should cumulate the data you get until you know you have enough then parse it and update your lcd widget accordingly.

    M Offline
    M Offline
    Mohit Tripathi
    wrote on 27 Mar 2018, 09:38 last edited by
    #16

    @SGaist @jsulm @J-Hilk
    The ardunio code is

    String a[10];
    
    void setup() 
    {
    
    Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
    
    }
    
    void loop() {
    if(Serial.available()>0)
    {
      for(int i=0;i<2;i++)
      {
        a[i] = Serial.readString();
      }
    
      for(int i=0;i<2;i++)
      {
        Serial.println(a[i]);
      }
      Serial.flush();
    }
    }
    

    I am getting the two strings while entering two string in arduino like "12" and "1" on ardunio IDE but why i am not getting the correct result on LCD widget in qt5 like "12" on LCD widget 1 and "1" on LCD widget 2. Please note that I entered the "12" in lineEdit and "1" lineEdit_2.

    J 1 Reply Last reply 27 Mar 2018, 10:02
    0
    • M Mohit Tripathi
      27 Mar 2018, 09:38

      @SGaist @jsulm @J-Hilk
      The ardunio code is

      String a[10];
      
      void setup() 
      {
      
      Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
      
      }
      
      void loop() {
      if(Serial.available()>0)
      {
        for(int i=0;i<2;i++)
        {
          a[i] = Serial.readString();
        }
      
        for(int i=0;i<2;i++)
        {
          Serial.println(a[i]);
        }
        Serial.flush();
      }
      }
      

      I am getting the two strings while entering two string in arduino like "12" and "1" on ardunio IDE but why i am not getting the correct result on LCD widget in qt5 like "12" on LCD widget 1 and "1" on LCD widget 2. Please note that I entered the "12" in lineEdit and "1" lineEdit_2.

      J Offline
      J Offline
      J.Hilk
      Moderators
      wrote on 27 Mar 2018, 10:02 last edited by
      #17

      @Mohit-Tripathi with the assumption, that all data arrives simultaneously at your QSerialPort you could try the following.

      According to the ardunino docs, println appends with \r\n so you can use readLine on Qt's side:

      void Dialog::serialReceived()
      {
          arduino->waitForReadyRead(100);
      
         if(arduino->canReadLine()){
            QStringList myData;
             while(arduino->canReadLine()){
                  char buf[1024];
                  qint64 lineLength = file.readLine(buf, sizeof(buf));
                  if (lineLength != -1) {
                        // the line is available in buf
                        myData.append(QString(buf));
                  }else qDebug() << "Reading Line failed";
             }
             if(myData.size() >0)
                 updatelcd1(myData.at(0);
             if(myData.size() >1)
                updatelcd2(myData.at(1));
         }else qDebug() << "Could not read lines";
      }
      

      Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


      Q: What's that?
      A: It's blue light.
      Q: What does it do?
      A: It turns blue.

      M 1 Reply Last reply 27 Mar 2018, 10:34
      1
      • J J.Hilk
        27 Mar 2018, 10:02

        @Mohit-Tripathi with the assumption, that all data arrives simultaneously at your QSerialPort you could try the following.

        According to the ardunino docs, println appends with \r\n so you can use readLine on Qt's side:

        void Dialog::serialReceived()
        {
            arduino->waitForReadyRead(100);
        
           if(arduino->canReadLine()){
              QStringList myData;
               while(arduino->canReadLine()){
                    char buf[1024];
                    qint64 lineLength = file.readLine(buf, sizeof(buf));
                    if (lineLength != -1) {
                          // the line is available in buf
                          myData.append(QString(buf));
                    }else qDebug() << "Reading Line failed";
               }
               if(myData.size() >0)
                   updatelcd1(myData.at(0);
               if(myData.size() >1)
                  updatelcd2(myData.at(1));
           }else qDebug() << "Could not read lines";
        }
        
        M Offline
        M Offline
        Mohit Tripathi
        wrote on 27 Mar 2018, 10:34 last edited by Mohit Tripathi
        #18

        @J.Hilk If I am using this code (according to your solution)

        if(myData.size() >0)
               {
                   updateLCD(myData.at(0));
               }
               else if(myData.size() >1)
               {
                  updateLCD1(myData.at(1));
               }
        

        I am still getting the same problem in LCD Widget. I am getting the both input on only one LCD widget.

        0_1522146624326_app1.png

        If I am using the same function call for both. I am getting the same output on both LCD widget.

         if(myData.size() >0)
               {
                   updateLCD(myData.at(0));
               }
               else if(myData.size() >1)
               {
                  updateLCD(myData.at(1));
               }
        void Dialog::updateLCD(QString sensor_reading)
        {
           ui->temp_lcdNumber_2->display(sensor_reading);
          ui->temp_lcdNumber_3->display(sensor_reading);
        }
        

        0_1522146831784_app2.png

        I am getting the same problem always.

        J 1 Reply Last reply 27 Mar 2018, 10:47
        0
        • M Mohit Tripathi
          27 Mar 2018, 10:34

          @J.Hilk If I am using this code (according to your solution)

          if(myData.size() >0)
                 {
                     updateLCD(myData.at(0));
                 }
                 else if(myData.size() >1)
                 {
                    updateLCD1(myData.at(1));
                 }
          

          I am still getting the same problem in LCD Widget. I am getting the both input on only one LCD widget.

          0_1522146624326_app1.png

          If I am using the same function call for both. I am getting the same output on both LCD widget.

           if(myData.size() >0)
                 {
                     updateLCD(myData.at(0));
                 }
                 else if(myData.size() >1)
                 {
                    updateLCD(myData.at(1));
                 }
          void Dialog::updateLCD(QString sensor_reading)
          {
             ui->temp_lcdNumber_2->display(sensor_reading);
            ui->temp_lcdNumber_3->display(sensor_reading);
          }
          

          0_1522146831784_app2.png

          I am getting the same problem always.

          J Offline
          J Offline
          J.Hilk
          Moderators
          wrote on 27 Mar 2018, 10:47 last edited by
          #19

          @Mohit-Tripathi said in How we can read particular string/data from any device to print on particular LCD in qt?:

          @J.Hilk If I am using this code (according to your solution)

          if(myData.size() >0)
                 {
                     updateLCD(myData.at(0));
                 }
                 else if(myData.size() >1)
                 {
                    updateLCD1(myData.at(1));
                 }
          

          are you kidding me?
          how is that code supposed to be executed? Im sure even the compiler will rationalize it away.

          if myData is bigger than 0 updateLCD will be called and the else will never execute

          if myData is noit bigger than 0 it can never bigger than 1

          Theres a reason I omitted the else


          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


          Q: What's that?
          A: It's blue light.
          Q: What does it do?
          A: It turns blue.

          M 1 Reply Last reply 27 Mar 2018, 11:12
          2
          • J J.Hilk
            27 Mar 2018, 10:47

            @Mohit-Tripathi said in How we can read particular string/data from any device to print on particular LCD in qt?:

            @J.Hilk If I am using this code (according to your solution)

            if(myData.size() >0)
                   {
                       updateLCD(myData.at(0));
                   }
                   else if(myData.size() >1)
                   {
                      updateLCD1(myData.at(1));
                   }
            

            are you kidding me?
            how is that code supposed to be executed? Im sure even the compiler will rationalize it away.

            if myData is bigger than 0 updateLCD will be called and the else will never execute

            if myData is noit bigger than 0 it can never bigger than 1

            Theres a reason I omitted the else

            M Offline
            M Offline
            Mohit Tripathi
            wrote on 27 Mar 2018, 11:12 last edited by
            #20

            @J.Hilk I am not kidding. I am getting the same problem when I started to do code. I am at beginner level in Qt. That's why I am facing the problem.
            But, here if Data size is less than 0. It should print only one enter value, not both value on one LCD widget. But, It is printing the both value on one LCD widget.

            1 Reply Last reply
            0
            • S Offline
              S Offline
              SGaist
              Lifetime Qt Champion
              wrote on 27 Mar 2018, 11:21 last edited by
              #21

              @Mohit-Tripathi said in How we can read particular string/data from any device to print on particular LCD in qt?:

              void Dialog::updateLCD(QString sensor_reading)
              {
              ui->temp_lcdNumber_2->display(sensor_reading);
              ui->temp_lcdNumber_3->display(sensor_reading);
              }

              As already explained several times: you are updating both temp_lcdNumber_2 and temp_lcdNumber_3 with the same value each time you call that function.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              M 1 Reply Last reply 27 Mar 2018, 11:35
              2
              • S SGaist
                27 Mar 2018, 11:21

                @Mohit-Tripathi said in How we can read particular string/data from any device to print on particular LCD in qt?:

                void Dialog::updateLCD(QString sensor_reading)
                {
                ui->temp_lcdNumber_2->display(sensor_reading);
                ui->temp_lcdNumber_3->display(sensor_reading);
                }

                As already explained several times: you are updating both temp_lcdNumber_2 and temp_lcdNumber_3 with the same value each time you call that function.

                M Offline
                M Offline
                Mohit Tripathi
                wrote on 27 Mar 2018, 11:35 last edited by Mohit Tripathi
                #22

                @SGaist
                As per discussion above, I have defined that if I make two functions, I get both write values on one LCD. But, if I define one function :

                void Dialog::updateLCD(QString sensor_reading)
                {
                ui->temp_lcdNumber_2->display(sensor_reading);
                ui->temp_lcdNumber_3->display(sensor_reading);
                }
                

                I get the same value on both LCD.

                But, my question was "how can I get the one input in one only LCD if we have multiple LCD widget?". I have mentioned in my comment as well as question.
                I have used two different functions, same functions and two arrays also. Please go through my recent code in above comment.

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on 27 Mar 2018, 18:57 last edited by
                  #23

                  That's simple and what @J-Hilk showed in his example. Properly parse the data you receive and update each LCD separately.

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  M 1 Reply Last reply 28 Mar 2018, 10:41
                  2
                  • S SGaist
                    27 Mar 2018, 18:57

                    That's simple and what @J-Hilk showed in his example. Properly parse the data you receive and update each LCD separately.

                    M Offline
                    M Offline
                    Mohit Tripathi
                    wrote on 28 Mar 2018, 10:41 last edited by Mohit Tripathi
                    #24

                    @SGaist @jsulm @J-Hilk @Global-Moderators @Moderators @J.Hilk
                    Is this a right way to write the data of two textEdit using pushbutton. I think that I am storing both values in one string that's why I am getting the both values on one LCD widget.

                    void Dialog::on_pushButton_clicked()
                    {
                        QString output1 = ui->lineEdit->text();
                      //  qDebug()<<output1;
                        QString output2 = ui->lineEdit_2->text();
                       // qDebug()<<output2;
                        if(arduino->isWritable())
                        {
                             arduino->write(output1.toStdString().c_str());
                            arduino->flush();
                             arduino->waitForBytesWritten(500);
                             arduino->write(output2.toStdString().c_str());
                             arduino->flush();
                             arduino->waitForBytesWritten(500);
                             qDebug()<<output1;
                             qDebug()<<output2;
                        }
                    }
                    
                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on 28 Mar 2018, 19:40 last edited by
                      #25

                      Don't @ the moderators unless you have an issue requiring moderation.

                      Depending on the content of your line edit, you can use toLatin1() or toUtf8() rather than making these two conversions.

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      2

                      25/25

                      28 Mar 2018, 19:40

                      • Login

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