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 communication
Forum Updated to NodeBB v4.3 + New Features

Serial communication

Scheduled Pinned Locked Moved Solved General and Desktop
39 Posts 6 Posters 4.8k 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.
  • JonBJ JonB

    @Damian7546
    Exactly as you have just written it!

    qDebug() << Response::Status::DISABLE << m_request[2];
    

    [You may have to do casting.] Sightly better is to use m_request.at(2) in place of m_request[2] here, but that is a detail and not related to your issue. You want to inspect the actual bytes in the QByteArray, not call QByteArray::toInt().

    J.HilkJ Offline
    J.HilkJ Offline
    J.Hilk
    Moderators
    wrote on last edited by
    #26

    @JonB casting is highly suggested, as Response::Status is an uint_8t and at() returns a char, aka int8_t


    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.

    JonBJ 1 Reply Last reply
    0
    • J.HilkJ J.Hilk

      @JonB casting is highly suggested, as Response::Status is an uint_8t and at() returns a char, aka int8_t

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

      @J-Hilk
      Yes, but what I meant is I don't have anything available to test what compiler says as I write answers. So that detail is left to OP :) Since the OP asks about comparing (with ==) one should be able to compare a unit_8t against a char/int8_t, I think, using C++ automatic expression promotion without bothering to cast/convert, I think? But maybe not/warning for enum value against integer?

      The important thing is no QByteArray::toInt() here!

      D J.HilkJ 2 Replies Last reply
      0
      • JonBJ JonB

        @J-Hilk
        Yes, but what I meant is I don't have anything available to test what compiler says as I write answers. So that detail is left to OP :) Since the OP asks about comparing (with ==) one should be able to compare a unit_8t against a char/int8_t, I think, using C++ automatic expression promotion without bothering to cast/convert, I think? But maybe not/warning for enum value against integer?

        The important thing is no QByteArray::toInt() here!

        D Offline
        D Offline
        Damian7546
        wrote on last edited by Damian7546
        #28

        @JonB It doesn't work:
        qDebug() << static_cast<int>(Response::Status::DISABLE) << m_request.at(2);

        Result:
        ASSERT: "uint(i) < uint(size())" in file C:/Qt/5.15.2/mingw81_32/include/QtCore/qbytearray.h, line 500

        And this way:
        qDebug() << static_cast<int>(Response::Status::DISABLE) << m_request[2];

        Result:
        Bez tytułu.jpg

        Where :
        m_request response: "\xFC\x05\x1A\xF4\xE8"

        JonBJ 1 Reply Last reply
        0
        • D Damian7546

          @JonB It doesn't work:
          qDebug() << static_cast<int>(Response::Status::DISABLE) << m_request.at(2);

          Result:
          ASSERT: "uint(i) < uint(size())" in file C:/Qt/5.15.2/mingw81_32/include/QtCore/qbytearray.h, line 500

          And this way:
          qDebug() << static_cast<int>(Response::Status::DISABLE) << m_request[2];

          Result:
          Bez tytułu.jpg

          Where :
          m_request response: "\xFC\x05\x1A\xF4\xE8"

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

          @Damian7546
          How difficult to try:

          qDebug() << static_cast<int>(Response::Status::DISABLE) << static_cast<int>(m_request[2]);
          // or
          qDebug() << static_cast<int>(Response::Status::DISABLE) << static_cast<int>(m_request.at(2));
          

          ? I leave you to resolve the C++ to your satisfaction.

          D 1 Reply Last reply
          0
          • JonBJ JonB

            @J-Hilk
            Yes, but what I meant is I don't have anything available to test what compiler says as I write answers. So that detail is left to OP :) Since the OP asks about comparing (with ==) one should be able to compare a unit_8t against a char/int8_t, I think, using C++ automatic expression promotion without bothering to cast/convert, I think? But maybe not/warning for enum value against integer?

            The important thing is no QByteArray::toInt() here!

            J.HilkJ Offline
            J.HilkJ Offline
            J.Hilk
            Moderators
            wrote on last edited by
            #30

            @JonB said in Serial communication:

            one should be able to compare a unit_8t against a char/int8_t, I think, using C++ automatic expression promotion without bothering to cast/convert, I think?

            nono, comparing different types via == or != will never promote any side "automatically"

            you can get something like that fi you wrap it in a function call or something but.

            But comparing uint8_t and int_8 will only work correctly if both values are between 0 and 128.


            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.

            JonBJ 1 Reply Last reply
            0
            • JonBJ JonB

              @Damian7546
              How difficult to try:

              qDebug() << static_cast<int>(Response::Status::DISABLE) << static_cast<int>(m_request[2]);
              // or
              qDebug() << static_cast<int>(Response::Status::DISABLE) << static_cast<int>(m_request.at(2));
              

              ? I leave you to resolve the C++ to your satisfaction.

              D Offline
              D Offline
              Damian7546
              wrote on last edited by
              #31

              @JonB Sill of topic.
              I have variable: Response::Status m_responseStatus.
              How properly assign byte form QByteArray to m_responseStatus?

              J.HilkJ 1 Reply Last reply
              0
              • D Damian7546

                @JonB Sill of topic.
                I have variable: Response::Status m_responseStatus.
                How properly assign byte form QByteArray to m_responseStatus?

                J.HilkJ Offline
                J.HilkJ Offline
                J.Hilk
                Moderators
                wrote on last edited by
                #32

                @Damian7546 you were originally pretty spot on:

                static_cast<Response::Status>(m_request.at(0));
                

                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.

                JonBJ D 2 Replies Last reply
                0
                • J.HilkJ J.Hilk

                  @JonB said in Serial communication:

                  one should be able to compare a unit_8t against a char/int8_t, I think, using C++ automatic expression promotion without bothering to cast/convert, I think?

                  nono, comparing different types via == or != will never promote any side "automatically"

                  you can get something like that fi you wrap it in a function call or something but.

                  But comparing uint8_t and int_8 will only work correctly if both values are between 0 and 128.

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

                  @J-Hilk said in Serial communication:

                  nono, comparing different types via == or != will never promote any side "automatically"

                  Umm, C or C++

                      char c('A');
                      if (c == 65)
                      {}
                  
                  example.cpp
                  Compiler returned: 0
                  

                  From Godbolt. That's "automatically promoting" char c to int 65, per C/C++ expression rules. Has done since K&R... ?
                  https://en.cppreference.com/w/cpp/language/implicit_conversion, e.g. Integral conversions topic.

                  1 Reply Last reply
                  0
                  • J.HilkJ J.Hilk

                    @Damian7546 you were originally pretty spot on:

                    static_cast<Response::Status>(m_request.at(0));
                    
                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by
                    #34

                    @J-Hilk said in Serial communication:

                    static_cast<Response::Status>(m_request.at(0));

                    I trust healthy disagreement in polite spirit is allowed. Personally, for style, I would not cast an arbitrary integer value to an enumeration, where it might fall outside the range of values. I would prefer

                    if (static_cast<int>(Response::Status::DISABLE) == static_cast<int>(m_request.at(2))
                    

                    which is what I wrote earlier, so doing the casting to int.

                    J.HilkJ 1 Reply Last reply
                    0
                    • JonBJ JonB

                      @J-Hilk said in Serial communication:

                      static_cast<Response::Status>(m_request.at(0));

                      I trust healthy disagreement in polite spirit is allowed. Personally, for style, I would not cast an arbitrary integer value to an enumeration, where it might fall outside the range of values. I would prefer

                      if (static_cast<int>(Response::Status::DISABLE) == static_cast<int>(m_request.at(2))
                      

                      which is what I wrote earlier, so doing the casting to int.

                      J.HilkJ Offline
                      J.HilkJ Offline
                      J.Hilk
                      Moderators
                      wrote on last edited by
                      #35

                      @JonB said in Serial communication:

                      which is what I wrote earlier, so doing the casting to int.

                      yes I agree, but not what the op asked.

                      From Godbolt. That's "automatically promoting" char c to int 65, per C/C++ expression rules. Has done since K&R... ?

                      fair! Not what I had in mind when I wrote my answer and not the pitfall I fell into numerous times :D


                      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.

                      1 Reply Last reply
                      0
                      • J.HilkJ J.Hilk

                        @Damian7546 you were originally pretty spot on:

                        static_cast<Response::Status>(m_request.at(0));
                        
                        D Offline
                        D Offline
                        Damian7546
                        wrote on last edited by
                        #36

                        @J-Hilk It still doesn't work:
                        m_responseStatus = static_cast<Response::Status>(m_request.at(2));

                        Result:
                        ASSERT: "uint(i) < uint(size())" in file C:/Qt/5.15.2/mingw81_32/include/QtCore/qbytearray.h, line 500

                        J.HilkJ 1 Reply Last reply
                        0
                        • D Damian7546

                          @J-Hilk It still doesn't work:
                          m_responseStatus = static_cast<Response::Status>(m_request.at(2));

                          Result:
                          ASSERT: "uint(i) < uint(size())" in file C:/Qt/5.15.2/mingw81_32/include/QtCore/qbytearray.h, line 500

                          J.HilkJ Offline
                          J.HilkJ Offline
                          J.Hilk
                          Moderators
                          wrote on last edited by
                          #37

                          @Damian7546 yes, but not the cast or assignment fails, but the access of your QByteArray, it doesn't have 3 Bytes in it and you try to access it outside of the range


                          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.

                          D 1 Reply Last reply
                          2
                          • J.HilkJ J.Hilk

                            @Damian7546 yes, but not the cast or assignment fails, but the access of your QByteArray, it doesn't have 3 Bytes in it and you try to access it outside of the range

                            D Offline
                            D Offline
                            Damian7546
                            wrote on last edited by
                            #38

                            @J-Hilk You're right

                            D 1 Reply Last reply
                            1
                            • D Damian7546

                              @J-Hilk You're right

                              D Offline
                              D Offline
                              Damian7546
                              wrote on last edited by
                              #39

                              Serial communication on state machine works great!

                              1 Reply Last reply
                              0
                              • D Damian7546 has marked this topic as solved on

                              • Login

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