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.
  • 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 Online
    JonBJ Online
    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 Online
        JonBJ Online
        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 Online
                JonBJ Online
                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 Online
                  JonBJ Online
                  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