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. Serial Data "reading" disorder
Forum Updated to NodeBB v4.3 + New Features

Serial Data "reading" disorder

Scheduled Pinned Locked Moved General and Desktop
arduinoseriesbuffer
16 Posts 3 Posters 6.7k Views 2 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.
  • mrjjM Offline
    mrjjM Offline
    mrjj
    Lifetime Qt Champion
    wrote on last edited by mrjj
    #3

    Hi
    Data most often comes in pieces so as @SGaist says, you must keep reading
    like
    m_readData.append( m_serialPort->readAll());
    until you got whole "line" of data
    you can check
    if (m_readData.size() >= EXPECTED_BYTES)
    Parse()
    or have kind of stop marker in the data.

    Other note. you could maybe use same separator between numbers, like | and then
    just say
    serialBuffer = QString::fromStdString(serialData.toStdString());
    QStringList list = serialBuffer .split ( "|" );
    then you have list of each number.
    list[0] being the first.

    Just a though. might not suit your needs.

    F 1 Reply Last reply
    1
    • SGaistS SGaist

      Hi and welcome to devnet,

      The usual way to handle incoming data is to store them in a buffer until there's enough of them to form a complete package and only then parse the packet.

      F Offline
      F Offline
      ftsm
      wrote on last edited by
      #4

      @SGaist Thank you or your answer. Yes i suppose that's what I have to do, but I don't really know how. I tried with "waitForReadyRead()" but he doesn't work, my code just stop and crash on it, despite what I read I don't really know how to use it properly.

      1 Reply Last reply
      0
      • mrjjM mrjj

        Hi
        Data most often comes in pieces so as @SGaist says, you must keep reading
        like
        m_readData.append( m_serialPort->readAll());
        until you got whole "line" of data
        you can check
        if (m_readData.size() >= EXPECTED_BYTES)
        Parse()
        or have kind of stop marker in the data.

        Other note. you could maybe use same separator between numbers, like | and then
        just say
        serialBuffer = QString::fromStdString(serialData.toStdString());
        QStringList list = serialBuffer .split ( "|" );
        then you have list of each number.
        list[0] being the first.

        Just a though. might not suit your needs.

        F Offline
        F Offline
        ftsm
        wrote on last edited by
        #5

        @mrjj Thank you.
        I used differents letters as separator because i wanted to reconize each data. Indeed I can just use one separator but it means that I have to gather all the data in the good order.
        ".append" seams like a good way but my problem is that I can't know the size of my expected bytes. Each potentiometer can send 1 to 4 digits. I assume there are already solutions for that, but I don't know what ...

        mrjjM 1 Reply Last reply
        0
        • F ftsm

          @mrjj Thank you.
          I used differents letters as separator because i wanted to reconize each data. Indeed I can just use one separator but it means that I have to gather all the data in the good order.
          ".append" seams like a good way but my problem is that I can't know the size of my expected bytes. Each potentiometer can send 1 to 4 digits. I assume there are already solutions for that, but I don't know what ...

          mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by
          #6

          @ftsm
          Ah ok, yes if they can come out of order then same separator is not a option.

          -Each potentiometer can send 1 to 4 digits
          so maybe there comes 1 byte or maybe 4 ?

          F 1 Reply Last reply
          1
          • mrjjM mrjj

            @ftsm
            Ah ok, yes if they can come out of order then same separator is not a option.

            -Each potentiometer can send 1 to 4 digits
            so maybe there comes 1 byte or maybe 4 ?

            F Offline
            F Offline
            ftsm
            wrote on last edited by
            #7

            @mrjj Indeed. And so if I try ".append" I will have a huge disorder in datas ...
            I'm still trying to figure out a way to get everything in order but nothing work fine yet

            mrjjM 1 Reply Last reply
            0
            • F ftsm

              @mrjj Indeed. And so if I try ".append" I will have a huge disorder in datas ...
              I'm still trying to figure out a way to get everything in order but nothing work fine yet

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #8

              @ftsm
              but how does the potentiometer send its data ?
              you have no control over the format?

              F 1 Reply Last reply
              1
              • mrjjM mrjj

                @ftsm
                but how does the potentiometer send its data ?
                you have no control over the format?

                F Offline
                F Offline
                ftsm
                wrote on last edited by
                #9

                @mrjj The potentiometer send its data via Arduino. I can write how I want to send it. First I tried with "," to separate, but I could'nt reconize wich data was what. So I tried with a specific letter before and after each potentiometer value. In this case it is really hard for me to extract the potentiometer value from the line (from serial) because I only know the "split" technic

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

                  Mix both techniques: an ID to know what kind of data you have and the "special" char to know where to split.

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

                  F 1 Reply Last reply
                  1
                  • SGaistS SGaist

                    Mix both techniques: an ID to know what kind of data you have and the "special" char to know where to split.

                    F Offline
                    F Offline
                    ftsm
                    wrote on last edited by
                    #11

                    @SGaist Yes I think that is my best move, that's what I'm currently trying to do.
                    But I have a last problem: how can I try the existence of a string from QstringList ? For example I need to know if after spliting "buffer_split[1]" exist ?

                    mrjjM 1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #12

                      You can use a while loop and take the first element at each iteration so no need for a particular check.

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

                      F 1 Reply Last reply
                      1
                      • F ftsm

                        @SGaist Yes I think that is my best move, that's what I'm currently trying to do.
                        But I have a last problem: how can I try the existence of a string from QstringList ? For example I need to know if after spliting "buffer_split[1]" exist ?

                        mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by
                        #13

                        @ftsm
                        also QstringList has a size() that tells the number of elements. (strings)
                        That also gives hints to valid index.

                        1 Reply Last reply
                        1
                        • SGaistS SGaist

                          You can use a while loop and take the first element at each iteration so no need for a particular check.

                          F Offline
                          F Offline
                          ftsm
                          wrote on last edited by
                          #14

                          @SGaist @mrjj Thank you for that, I managed to split correctly and find the right data.
                          But I am still able to do that only on debug mode, when I try to run the program it's like i'm going too fast and my "->ReadAll()" don't gather enought data. (I saw that with some qDebug()).
                          So I go back to my first problem, if I use a while loop with "append" I will mix the data.
                          Can't I use "waitForReadyRead()" ?

                          1 Reply Last reply
                          0
                          • F Offline
                            F Offline
                            ftsm
                            wrote on last edited by
                            #15

                            OH MY GOD that was the solution since the begining !! It's 1:30am and it's perfectly working !!

                            THank you guys I love you so much !!

                            YAAaaaaaayyy my first beautiful program on Qt and it rules !! THANK YOU

                            mrjjM 1 Reply Last reply
                            0
                            • F ftsm

                              OH MY GOD that was the solution since the begining !! It's 1:30am and it's perfectly working !!

                              THank you guys I love you so much !!

                              YAAaaaaaayyy my first beautiful program on Qt and it rules !! THANK YOU

                              mrjjM Offline
                              mrjjM Offline
                              mrjj
                              Lifetime Qt Champion
                              wrote on last edited by
                              #16

                              @ftsm
                              Congratulations with the baby ;)

                              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