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. UART terminal
QtWS25 Last Chance

UART terminal

Scheduled Pinned Locked Moved Unsolved General and Desktop
15 Posts 4 Posters 1.1k 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.
  • A Offline
    A Offline
    another_one
    wrote on last edited by another_one
    #1

    Hello!

    I wrote program which transfer "big data"(file) and receive ASCII simbol
    Now I need to receive alse ASCII strinigs and control carriedge return and feedback
    To receive ASCII symbol I used timer and call read fuction by timer count release
    And the problem is I don't know how to call read function to be able to receive all ASCII strings without their size depends and how to call read permamently without taking all processing time

    Thanks in advance

    A 1 Reply Last reply
    0
    • A another_one

      Hello!

      I wrote program which transfer "big data"(file) and receive ASCII simbol
      Now I need to receive alse ASCII strinigs and control carriedge return and feedback
      To receive ASCII symbol I used timer and call read fuction by timer count release
      And the problem is I don't know how to call read function to be able to receive all ASCII strings without their size depends and how to call read permamently without taking all processing time

      Thanks in advance

      A Offline
      A Offline
      another_one
      wrote on last edited by another_one
      #2

      @another_one
      Sorry for what post, I was wrong in declaring the point of the question.
      Now I can receive any size data strings from COM-port by using checking bytes available.
      And this data I transfer to textEdit at all, but the result I see in some wrong format, - I see uncompleted, by new line, strings.
      And I think it has two reason:

      1. timer->start(10), - I use timer event to read data from qextserialport driver and that divides the string;
      2. ui->textEdit->append(tr("%1").arg(stReadHex)), - This function adds new line.

      Thus, I need to control new line adding or exclude string dividing.
      Please help!

      Christian EhrlicherC 1 Reply Last reply
      0
      • A another_one

        @another_one
        Sorry for what post, I was wrong in declaring the point of the question.
        Now I can receive any size data strings from COM-port by using checking bytes available.
        And this data I transfer to textEdit at all, but the result I see in some wrong format, - I see uncompleted, by new line, strings.
        And I think it has two reason:

        1. timer->start(10), - I use timer event to read data from qextserialport driver and that divides the string;
        2. ui->textEdit->append(tr("%1").arg(stReadHex)), - This function adds new line.

        Thus, I need to control new line adding or exclude string dividing.
        Please help!

        Christian EhrlicherC Offline
        Christian EhrlicherC Offline
        Christian Ehrlicher
        Lifetime Qt Champion
        wrote on last edited by
        #3

        @another_one said in UART terminal:

        timer->start(10), - I use timer event to read data from qextserialport driver and that divides the string;

        Don't use a timer but signals and slots.
        And since it's a stream you will for sure get some data but not a complete line - it's up to you to bring the data to a desired format.

        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
        Visit the Qt Academy at https://academy.qt.io/catalog

        A 1 Reply Last reply
        1
        • Christian EhrlicherC Christian Ehrlicher

          @another_one said in UART terminal:

          timer->start(10), - I use timer event to read data from qextserialport driver and that divides the string;

          Don't use a timer but signals and slots.
          And since it's a stream you will for sure get some data but not a complete line - it's up to you to bring the data to a desired format.

          A Offline
          A Offline
          another_one
          wrote on last edited by
          #4

          @Christian-Ehrlicher

          Thank you for your replay !

          Could you give me some example, please ?
          I serached about what before, but didn't find any similar to my case.

          Thanks!

          Christian EhrlicherC 1 Reply Last reply
          0
          • A another_one

            @Christian-Ehrlicher

            Thank you for your replay !

            Could you give me some example, please ?
            I serached about what before, but didn't find any similar to my case.

            Thanks!

            Christian EhrlicherC Offline
            Christian EhrlicherC Offline
            Christian Ehrlicher
            Lifetime Qt Champion
            wrote on last edited by
            #5

            The QSerialPort documentation has a lot of examples on how to use the serial port: https://doc.qt.io/qt-5/qtserialport-examples.html

            Using signals and slots is a basic Qt feature you should learn - otherwise you will not have fun with Qt!

            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
            Visit the Qt Academy at https://academy.qt.io/catalog

            A 1 Reply Last reply
            1
            • Christian EhrlicherC Christian Ehrlicher

              The QSerialPort documentation has a lot of examples on how to use the serial port: https://doc.qt.io/qt-5/qtserialport-examples.html

              Using signals and slots is a basic Qt feature you should learn - otherwise you will not have fun with Qt!

              A Offline
              A Offline
              another_one
              wrote on last edited by
              #6

              @Christian-Ehrlicher
              Thank you!

              A 1 Reply Last reply
              0
              • A another_one

                @Christian-Ehrlicher
                Thank you!

                A Offline
                A Offline
                another_one
                wrote on last edited by
                #7

                @another_one
                With your help I have done UART receive via signal and clots:

                connect(port, SIGNAL(readyRead()), this, SLOT(readData()));
                void MIPS_monitor::readData()
                {
                    const QByteArray data = port->readAll();
                    ui->textEdit->append(data);
                }
                

                But string dividing is still exist

                JonBJ 1 Reply Last reply
                0
                • A another_one

                  @another_one
                  With your help I have done UART receive via signal and clots:

                  connect(port, SIGNAL(readyRead()), this, SLOT(readData()));
                  void MIPS_monitor::readData()
                  {
                      const QByteArray data = port->readAll();
                      ui->textEdit->append(data);
                  }
                  

                  But string dividing is still exist

                  JonBJ Offline
                  JonBJ Offline
                  JonB
                  wrote on last edited by JonB
                  #8

                  @another_one
                  @Christian-Ehrlicher has already answered that "string dividing" (as you call it) is natural/possible/inevitable. The signals have no guarantee they will be emitted e.g. "one line at a time". That's how it works.

                  As he has said

                  And since it's a stream you will for sure get some data but not a complete line - it's up to you to bring the data to a desired format.

                  It is your job to write code to "aggregate" received data in a buffer if you might want to "join" the data received at multiple signals.

                  A 1 Reply Last reply
                  1
                  • JonBJ JonB

                    @another_one
                    @Christian-Ehrlicher has already answered that "string dividing" (as you call it) is natural/possible/inevitable. The signals have no guarantee they will be emitted e.g. "one line at a time". That's how it works.

                    As he has said

                    And since it's a stream you will for sure get some data but not a complete line - it's up to you to bring the data to a desired format.

                    It is your job to write code to "aggregate" received data in a buffer if you might want to "join" the data received at multiple signals.

                    A Offline
                    A Offline
                    another_one
                    wrote on last edited by
                    #9

                    @JonB

                    Sorry I didnt understand
                    I checked data stream from external device and that is not devide transferring data
                    I thouught what qt driver will give receiced data as is but I has his job as results in the following format:

                    
                    Pin # 4 LED ON
                    
                    Pin # 3 
                    LED ON
                    
                    Pin # 3 LED OFF
                    
                    Pin # 4 LED OFF
                    
                    Pin # 3 LED ON
                    
                    Pin # 3 LED OFF
                    
                    Pin # 4 LED ON
                    
                    Pin # 3 LED ON
                    
                    Pin # 3 LED OFF
                    
                    Pin # 4 LED OFF
                    
                    Pin # 3 LED ON
                    
                    Pin # 3 LED OFF
                    
                    Pin # 4 LED ON
                    
                    Pin # 3 LED ON
                    
                    Pin # 3 LED OFF
                    
                    Pin 
                    # 4 LED OFF
                    
                    Pin # 3 LED ON
                    
                    Pin # 3
                     LED OFF
                    
                    Pin # 4 LED ON
                    
                    Pin # 3 LED ON
                    
                    Pin # 3 LED OFF
                    
                    

                    Is it normal?, do you want to say what?
                    And as I udenerstand you right I must buffer (I think what it has already buffered by qt driver)that data to format it ?

                    Thanks

                    JonBJ M 2 Replies Last reply
                    0
                    • A another_one

                      @JonB

                      Sorry I didnt understand
                      I checked data stream from external device and that is not devide transferring data
                      I thouught what qt driver will give receiced data as is but I has his job as results in the following format:

                      
                      Pin # 4 LED ON
                      
                      Pin # 3 
                      LED ON
                      
                      Pin # 3 LED OFF
                      
                      Pin # 4 LED OFF
                      
                      Pin # 3 LED ON
                      
                      Pin # 3 LED OFF
                      
                      Pin # 4 LED ON
                      
                      Pin # 3 LED ON
                      
                      Pin # 3 LED OFF
                      
                      Pin # 4 LED OFF
                      
                      Pin # 3 LED ON
                      
                      Pin # 3 LED OFF
                      
                      Pin # 4 LED ON
                      
                      Pin # 3 LED ON
                      
                      Pin # 3 LED OFF
                      
                      Pin 
                      # 4 LED OFF
                      
                      Pin # 3 LED ON
                      
                      Pin # 3
                       LED OFF
                      
                      Pin # 4 LED ON
                      
                      Pin # 3 LED ON
                      
                      Pin # 3 LED OFF
                      
                      

                      Is it normal?, do you want to say what?
                      And as I udenerstand you right I must buffer (I think what it has already buffered by qt driver)that data to format it ?

                      Thanks

                      JonBJ Offline
                      JonBJ Offline
                      JonB
                      wrote on last edited by JonB
                      #10

                      @another_one said in UART terminal:

                      Pin # 3
                      LED ON

                      Take this as an example. We have explained that it can happen that device sends Pin #3 LED ON in a single write(). So no "divide" as you call it.

                      But it is possible that readAll() can receive this in multiple "chunks"/"divides". So It could arrive as 2 pieces to readAll(): first time it gets Pin # 3, second time it gets remaining LED ON. And that seems to be happening here.

                      Since QTextEdit::append(text) documents "Appends a new paragraph" you will end up with separate lines if you call append() twice, once for each "fragment" of the line. If you want it output on one line you will need to "join" partial lines like this, only call append() when you have (one or more) full lines.

                      A 1 Reply Last reply
                      1
                      • JonBJ JonB

                        @another_one said in UART terminal:

                        Pin # 3
                        LED ON

                        Take this as an example. We have explained that it can happen that device sends Pin #3 LED ON in a single write(). So no "divide" as you call it.

                        But it is possible that readAll() can receive this in multiple "chunks"/"divides". So It could arrive as 2 pieces to readAll(): first time it gets Pin # 3, second time it gets remaining LED ON. And that seems to be happening here.

                        Since QTextEdit::append(text) documents "Appends a new paragraph" you will end up with separate lines if you call append() twice, once for each "fragment" of the line. If you want it output on one line you will need to "join" partial lines like this, only call append() when you have (one or more) full lines.

                        A Offline
                        A Offline
                        another_one
                        wrote on last edited by
                        #11

                        @JonB

                        Thank you for your detailed explanation the reason of the problem!
                        But sorry again, I didn't understand what should I do (how can I call "only append()") to solve this problem?.

                        Thanks in advaunce!

                        JonBJ 1 Reply Last reply
                        0
                        • A another_one

                          @JonB

                          Thank you for your detailed explanation the reason of the problem!
                          But sorry again, I didn't understand what should I do (how can I call "only append()") to solve this problem?.

                          Thanks in advaunce!

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on last edited by
                          #12

                          @another_one
                          Build up a line (however they are terminated, carriage return or whatever) before calling QTextEdit:: append(). I would keep a class member variable for a buffer and each time realAll() returns anything append it into that buffer. When a line is complete add it to the text edit and remove from the buffer. That's what a buffer is.

                          A 1 Reply Last reply
                          1
                          • JonBJ JonB

                            @another_one
                            Build up a line (however they are terminated, carriage return or whatever) before calling QTextEdit:: append(). I would keep a class member variable for a buffer and each time realAll() returns anything append it into that buffer. When a line is complete add it to the text edit and remove from the buffer. That's what a buffer is.

                            A Offline
                            A Offline
                            another_one
                            wrote on last edited by
                            #13

                            @JonB

                            Thank you again! sorry, but can you give me some example please?

                            And why simplified() and trimmed() can not solve this problem(I tried)?
                            And I don't understand one more moment:
                            I receive data what can consits of \r\n and "Appends a new paragraph" gives another one \r\n.
                            How can I parse needest one in this case?

                            1 Reply Last reply
                            0
                            • A another_one

                              @JonB

                              Sorry I didnt understand
                              I checked data stream from external device and that is not devide transferring data
                              I thouught what qt driver will give receiced data as is but I has his job as results in the following format:

                              
                              Pin # 4 LED ON
                              
                              Pin # 3 
                              LED ON
                              
                              Pin # 3 LED OFF
                              
                              Pin # 4 LED OFF
                              
                              Pin # 3 LED ON
                              
                              Pin # 3 LED OFF
                              
                              Pin # 4 LED ON
                              
                              Pin # 3 LED ON
                              
                              Pin # 3 LED OFF
                              
                              Pin # 4 LED OFF
                              
                              Pin # 3 LED ON
                              
                              Pin # 3 LED OFF
                              
                              Pin # 4 LED ON
                              
                              Pin # 3 LED ON
                              
                              Pin # 3 LED OFF
                              
                              Pin 
                              # 4 LED OFF
                              
                              Pin # 3 LED ON
                              
                              Pin # 3
                               LED OFF
                              
                              Pin # 4 LED ON
                              
                              Pin # 3 LED ON
                              
                              Pin # 3 LED OFF
                              
                              

                              Is it normal?, do you want to say what?
                              And as I udenerstand you right I must buffer (I think what it has already buffered by qt driver)that data to format it ?

                              Thanks

                              M Offline
                              M Offline
                              mpergand
                              wrote on last edited by
                              #14

                              @another_one said in UART terminal:

                              I checked data stream from external device and that is not devide transferring data

                              In this case, have a try with canReadline() and then readLine()
                              Should be easier ...

                              A 1 Reply Last reply
                              2
                              • M mpergand

                                @another_one said in UART terminal:

                                I checked data stream from external device and that is not devide transferring data

                                In this case, have a try with canReadline() and then readLine()
                                Should be easier ...

                                A Offline
                                A Offline
                                another_one
                                wrote on last edited by
                                #15

                                @mpergand

                                Thanks to all
                                Now I have found temporary descision based on insertPlainText of QTextEdit Class

                                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