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!

    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