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. Sending Packet through QSerialport ?
Qt 6.11 is out! See what's new in the release blog

Sending Packet through QSerialport ?

Scheduled Pinned Locked Moved Solved Mobile and Embedded
24 Posts 4 Posters 6.4k 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.
  • B Offline
    B Offline
    bhargav
    wrote on last edited by
    #9

    how to convert quint8 startbyte = 0xF0;

    to QByteArray ?

    1 Reply Last reply
    0
    • aha_1980A Offline
      aha_1980A Offline
      aha_1980
      Lifetime Qt Champion
      wrote on last edited by
      #10

      @bhargav

      E.g. the same way you already used:

      QByteArray send;
      send.append('0xF0');

      Or use the constructor: QByteArray ba(1, char(startbyte));

      Regards

      Qt has to stay free or it will die.

      1 Reply Last reply
      2
      • B Offline
        B Offline
        bhargav
        wrote on last edited by
        #11

        transmit data: "\xF0\x12\x96\x96krishnalkjkl;d\xF1"
        data size: "\xF0\x12\x96\x96kris"

        why my receiver is not receiving all data?

        receiver code:

        QByteArray data ;
        data = m_pcSerialport->readAll();

        qDebug() <<"data size:"<< data;
        

        tx code:

        QByteArray sending;

        QString str = ui->textEdit->toPlainText();
        
        QByteArray send = str.toUtf8();
        
        int size_packet_length = str.size();
        
        qDebug() << "size of payload:"<< size_packet_length;
        
        quint16 req_code = 0xFD96;
        char reqbytes[2];
        reqbytes[0] = (req_code >> 8) & 0xff;
        reqbytes[1] = req_code & 0xff;
        QByteArray 
        
        qDebug() <<"bytes of reqcode:"<<req;
        
        int size_reqcode = sizeof(req_code);
        
        qDebug() << "size of reqcode:"<< size_reqcode;
        
        
        quint8 startbyte = 0xF0;
        
        int size_startbyte = sizeof(startbyte);
        
        qDebug() << "size of startbyte:"<< size_startbyte;
        
        quint8 endbyte = 0xF1;
        
         int size_endbyte = sizeof(endbyte);
        
         qDebug() << "size of endbyte:"<< size_endbyte;
        
        
         int total_datalength = size_reqcode + size_startbyte + size_endbyte + size_packet_length;
        

        // QByteArray totallength = QByteArray::number(total_datalength);

         qDebug() << "size of total datalength:"<< total_datalength;
        
        sending.append(startbyte);
        sending.append(total_datalength);
        sending.append(req);
        sending.append(send);
        sending.append(endbyte);
        
        m_pcSerialport->write(sending,total_datalength);
        
        qDebug() << "transmit data:"<< sending;
        

        tell me why my receiver not receiving all data ?

        any mistakes if found in code suggest me to better?

        aha_1980A 1 Reply Last reply
        0
        • B bhargav

          transmit data: "\xF0\x12\x96\x96krishnalkjkl;d\xF1"
          data size: "\xF0\x12\x96\x96kris"

          why my receiver is not receiving all data?

          receiver code:

          QByteArray data ;
          data = m_pcSerialport->readAll();

          qDebug() <<"data size:"<< data;
          

          tx code:

          QByteArray sending;

          QString str = ui->textEdit->toPlainText();
          
          QByteArray send = str.toUtf8();
          
          int size_packet_length = str.size();
          
          qDebug() << "size of payload:"<< size_packet_length;
          
          quint16 req_code = 0xFD96;
          char reqbytes[2];
          reqbytes[0] = (req_code >> 8) & 0xff;
          reqbytes[1] = req_code & 0xff;
          QByteArray 
          
          qDebug() <<"bytes of reqcode:"<<req;
          
          int size_reqcode = sizeof(req_code);
          
          qDebug() << "size of reqcode:"<< size_reqcode;
          
          
          quint8 startbyte = 0xF0;
          
          int size_startbyte = sizeof(startbyte);
          
          qDebug() << "size of startbyte:"<< size_startbyte;
          
          quint8 endbyte = 0xF1;
          
           int size_endbyte = sizeof(endbyte);
          
           qDebug() << "size of endbyte:"<< size_endbyte;
          
          
           int total_datalength = size_reqcode + size_startbyte + size_endbyte + size_packet_length;
          

          // QByteArray totallength = QByteArray::number(total_datalength);

           qDebug() << "size of total datalength:"<< total_datalength;
          
          sending.append(startbyte);
          sending.append(total_datalength);
          sending.append(req);
          sending.append(send);
          sending.append(endbyte);
          
          m_pcSerialport->write(sending,total_datalength);
          
          qDebug() << "transmit data:"<< sending;
          

          tell me why my receiver not receiving all data ?

          any mistakes if found in code suggest me to better?

          aha_1980A Offline
          aha_1980A Offline
          aha_1980
          Lifetime Qt Champion
          wrote on last edited by aha_1980
          #12

          @bhargav

          Serial ports are slow, therefore your receive the answer in chunks.

          If you look at my answer above again, I said you need a member variable and you append to it.

          In your code you have a local variable, and you assign to it. That's why its not working for you :)

          Regards

          Qt has to stay free or it will die.

          1 Reply Last reply
          2
          • B Offline
            B Offline
            bhargav
            wrote on last edited by
            #13

            my receiver code:

            QByteArray data ;
            data += m_pcSerialport->readAll();

             qDebug() <<"data size:"<< data;
             
            
             QByteArray received = data.toHex();
            
             qDebug()<<"testing :"<<received;
             
            
             for (int i = 0; i < received.size(); i++)
             {
                queue.enqueue(received[i]);
             }
            
             qDebug() <<"queue:"<<queue;
            

            how to compare queue with 0xF0(STX), 0xF1(ETX)? how to extract data or payload?

            aha_1980A 1 Reply Last reply
            0
            • B bhargav

              my receiver code:

              QByteArray data ;
              data += m_pcSerialport->readAll();

               qDebug() <<"data size:"<< data;
               
              
               QByteArray received = data.toHex();
              
               qDebug()<<"testing :"<<received;
               
              
               for (int i = 0; i < received.size(); i++)
               {
                  queue.enqueue(received[i]);
               }
              
               qDebug() <<"queue:"<<queue;
              

              how to compare queue with 0xF0(STX), 0xF1(ETX)? how to extract data or payload?

              aha_1980A Offline
              aha_1980A Offline
              aha_1980
              Lifetime Qt Champion
              wrote on last edited by
              #14

              Hi @bhargav,

              as you still insist using a queue, then you should ask the person who told you so.

              If you wanne go my way, I can surely help you, but if you want to go your way, you're on your own.

              Regards

              Qt has to stay free or it will die.

              1 Reply Last reply
              1
              • B Offline
                B Offline
                bhargav
                wrote on last edited by
                #15

                ok sir ,

                QByteArray data;
                data +=m_pcserialport->readall();

                qDebug() <<"data received "<<data;

                /// after that i got output like this

                \xF0\x0E\xFD\x96haihelloeveryone\xF1

                from that i have to check the conditions above mention

                if(data == 0xF0)
                {
                qDebug()<<"STX is received ";
                }

                if(data == 0xF1)
                {
                qDebug()<<"ETX is received";
                }

                and how to extract data "haihelloeveryone"? from the received .

                help me code without Queue?

                aha_1980A 1 Reply Last reply
                0
                • B bhargav

                  ok sir ,

                  QByteArray data;
                  data +=m_pcserialport->readall();

                  qDebug() <<"data received "<<data;

                  /// after that i got output like this

                  \xF0\x0E\xFD\x96haihelloeveryone\xF1

                  from that i have to check the conditions above mention

                  if(data == 0xF0)
                  {
                  qDebug()<<"STX is received ";
                  }

                  if(data == 0xF1)
                  {
                  qDebug()<<"ETX is received";
                  }

                  and how to extract data "haihelloeveryone"? from the received .

                  help me code without Queue?

                  aha_1980A Offline
                  aha_1980A Offline
                  aha_1980
                  Lifetime Qt Champion
                  wrote on last edited by aha_1980
                  #16

                  @bhargav

                  1. As said above, you need a member variable. data is local, appending to it does not make sense.
                  2. I found out that you only need to check if both STX and ETX are in the frame, otherwise you exit the slot and just wait for more data come in (the slot will be
                    called again).
                  3. Note that parts of your protocol are not used yet (and maybe not needed?): data lenght and request code.
                  void MainWindow::slotDataReceived(void)
                  {
                      m_buf += m_port->readAll();
                  
                      for (;;) {
                          int posStx = m_buf.indexOf(char(0xF0));
                          int posEtx = m_buf.indexOf(char(0xF1));
                  
                          if (posStx >= 0 && posEtx >= 0) {
                              // extract payload
                              QByteArray data = m_buf.mid(posStx + 4, posEtx - posStx - 4);
                              // remove frame from receive buffer
                              m_buf.remove(0, posEtx + 1);
                              qDebug() << "Data =" << data;
                          } else {
                              break;
                          }
                      }
                  }
                  

                  Regards

                  Qt has to stay free or it will die.

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

                    @aha_1980 ,

                    I admire for your patience. )))

                    1 Reply Last reply
                    1
                    • B Offline
                      B Offline
                      bhargav
                      wrote on last edited by
                      #18

                      thank you so much for your support.

                      output of code:
                      transmit data: "\xF0\x0F\xFD\x96hai krishna\xF1"
                      data received : "\xF0\x0F\xFD\x96hai "
                      data received : "krishna

                      in receiver last byte is not receiving .so,it is not going to if condition for further operations.

                      tnsmitter code:

                      // sending through serialport
                      sending.append(startbyte);
                      sending.append(total_datalength);
                      sending.append(req);
                      sending.append(send);
                      sending.append(endbyte);

                       m_pcSerialport->write(sending,total_datalength);
                      
                       qDebug() << "transmit data:"<< sending;
                      

                      how to receive last byte?

                      1 Reply Last reply
                      0
                      • B Offline
                        B Offline
                        bhargav
                        wrote on last edited by
                        #19

                        hmm got it.

                        1 Reply Last reply
                        0
                        • B Offline
                          B Offline
                          bhargav
                          wrote on last edited by
                          #20

                          transmit data: "\xF0\x0B\xFD\x96krishna\xF1"
                          data received : "\xF0\x0B\xFD\x96kris"
                          for STX 0
                          for ETX -1
                          data received : "hna\xF1"
                          for STX -1
                          for ETX 3

                          like this ,it fail to check the condition?

                          1 Reply Last reply
                          0
                          • aha_1980A Offline
                            aha_1980A Offline
                            aha_1980
                            Lifetime Qt Champion
                            wrote on last edited by aha_1980
                            #21

                            Hi @bhargav

                            Please show your receive slot code.

                            Also, I thought a bit more about it and got questions you can ask yourself:

                            1. What happens if size or function code contains the chars STX or ETX?
                            2. In your send function, you convert a QString toUtf8(). Potentially there might be characters that map to STX or ETX too.

                            Regards

                            Qt has to stay free or it will die.

                            1 Reply Last reply
                            1
                            • B Offline
                              B Offline
                              bhargav
                              wrote on last edited by
                              #22

                              my output is :
                              Port is open: "Unknown error"
                              size of payload: 23
                              size of reqcode: 2
                              size of startbyte: 1
                              size of endbyte: 1
                              size of total datalength: 27
                              transmit data: "\xF0\x1B\xFD\x96krishnalkgkjhkjddhaksjd\xF1"
                              data received : "\xF0\x1B\xFD\x96kris"
                              data size : 8
                              Minimum length is received
                              received payload "kri"
                              data received : "hnalkgk"
                              data size : 7
                              Minimum length is received
                              both stx and etx recived
                              received payload "krikg"
                              data received : "jhkjddha"
                              data size : 8
                              Minimum length is received
                              both stx and etx recived
                              received payload "krikgddh"
                              data received : "ksjd\xF1"
                              data size : 5
                              Minimum length is received
                              both stx and etx recived
                              received payload "krikgddh"

                              my receiver code is:

                              //just checking for bytes available
                              if(m_pcSerialport->bytesAvailable() == 0 ) {

                                  qDebug() << "no data to Receive : bad signal?";
                                  return;
                               }
                              
                              
                              // reading data in serial port
                               QByteArray m_buf;
                              
                              m_buf = m_pcSerialport->readAll();
                              

                              // char *buff;

                              // int size = m_pcSerialport->bytesAvailable();

                              // int byte = peek();

                              // qDebug() <<"data received :"<< byte;

                              qDebug() <<"data received :"<< m_buf;
                              qDebug() <<"data size :"<< m_buf.size();
                              
                              
                               // check for minimum length
                               int minbytes = 3;
                              
                               if(m_buf.size() >= minbytes)
                               {
                                   qDebug() << "Minimum length is received";
                               }
                              
                               int stx = m_buf.indexOf(char(0xF0));
                               int etx = m_buf.indexOf(char(0xF1));
                              
                              
                              if(stx && etx) {
                              
                                  qDebug() << "both stx and etx recived";
                              }
                              
                               //   calc full len
                               //   check full len data avail or not
                              

                              // if(etx)
                              // {
                              // qDebug() <<"full length is received";

                              // qDebug() <<"full length:"<< m_buf.size();
                              // }

                               // Extracting the data to show in GUI
                               for (int i = 4; i < m_buf.size() - 1; i++) {
                              
                                   ba.append(m_buf[i]);
                               }
                              
                                qDebug() <<"received payload"<< ba;
                              
                                ui->textEdit_2->setPlainText(ba);
                              

                              }

                              how to calculate full packet length and extract payload to show in GUI?

                              help me , i am getting payload in gui but some data is losing ? i want without loosing data i want to show in GUI.

                              aha_1980A 1 Reply Last reply
                              0
                              • B bhargav

                                my output is :
                                Port is open: "Unknown error"
                                size of payload: 23
                                size of reqcode: 2
                                size of startbyte: 1
                                size of endbyte: 1
                                size of total datalength: 27
                                transmit data: "\xF0\x1B\xFD\x96krishnalkgkjhkjddhaksjd\xF1"
                                data received : "\xF0\x1B\xFD\x96kris"
                                data size : 8
                                Minimum length is received
                                received payload "kri"
                                data received : "hnalkgk"
                                data size : 7
                                Minimum length is received
                                both stx and etx recived
                                received payload "krikg"
                                data received : "jhkjddha"
                                data size : 8
                                Minimum length is received
                                both stx and etx recived
                                received payload "krikgddh"
                                data received : "ksjd\xF1"
                                data size : 5
                                Minimum length is received
                                both stx and etx recived
                                received payload "krikgddh"

                                my receiver code is:

                                //just checking for bytes available
                                if(m_pcSerialport->bytesAvailable() == 0 ) {

                                    qDebug() << "no data to Receive : bad signal?";
                                    return;
                                 }
                                
                                
                                // reading data in serial port
                                 QByteArray m_buf;
                                
                                m_buf = m_pcSerialport->readAll();
                                

                                // char *buff;

                                // int size = m_pcSerialport->bytesAvailable();

                                // int byte = peek();

                                // qDebug() <<"data received :"<< byte;

                                qDebug() <<"data received :"<< m_buf;
                                qDebug() <<"data size :"<< m_buf.size();
                                
                                
                                 // check for minimum length
                                 int minbytes = 3;
                                
                                 if(m_buf.size() >= minbytes)
                                 {
                                     qDebug() << "Minimum length is received";
                                 }
                                
                                 int stx = m_buf.indexOf(char(0xF0));
                                 int etx = m_buf.indexOf(char(0xF1));
                                
                                
                                if(stx && etx) {
                                
                                    qDebug() << "both stx and etx recived";
                                }
                                
                                 //   calc full len
                                 //   check full len data avail or not
                                

                                // if(etx)
                                // {
                                // qDebug() <<"full length is received";

                                // qDebug() <<"full length:"<< m_buf.size();
                                // }

                                 // Extracting the data to show in GUI
                                 for (int i = 4; i < m_buf.size() - 1; i++) {
                                
                                     ba.append(m_buf[i]);
                                 }
                                
                                  qDebug() <<"received payload"<< ba;
                                
                                  ui->textEdit_2->setPlainText(ba);
                                

                                }

                                how to calculate full packet length and extract payload to show in GUI?

                                help me , i am getting payload in gui but some data is losing ? i want without loosing data i want to show in GUI.

                                aha_1980A Offline
                                aha_1980A Offline
                                aha_1980
                                Lifetime Qt Champion
                                wrote on last edited by
                                #23

                                Hi @bhargav,

                                please read my post with the example again.

                                1. m_buf needs to be a member variable. (Why?)
                                2. you need to append to m_buf. (Why?)

                                Regards

                                Qt has to stay free or it will die.

                                1 Reply Last reply
                                1
                                • B Offline
                                  B Offline
                                  bhargav
                                  wrote on last edited by
                                  #24

                                  thank you for your support ,just got the output.

                                  1 Reply Last reply
                                  1

                                  • Login

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