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

Serial communication

Scheduled Pinned Locked Moved Solved General and Desktop
39 Posts 6 Posters 5.1k 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 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 Online
      J.HilkJ Online
      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 Online
          J.HilkJ Online
          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 Online
                J.HilkJ Online
                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 Online
                    J.HilkJ Online
                    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