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.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.
  • D Damian7546

    @JonB So ho to compare Response::Status::DISABLE to byte in QByteArray m_request[2] ?

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

    @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 1 Reply Last reply
    1
    • 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