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