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

    @Damian7546 said in Serial communication:

    In m_responseStatus variable I have 0x1A value, but below statement is not equal:

    Sorry, I don't believe that. Start with:

    qDebug() << int(m_responseStatus)  << int(Response::Status::DISABLE) << 0x1A;
    

    [I assume int() is good enough here to test. You can go static_cast<int>(...) if necessary.]

    D Offline
    D Offline
    Damian7546
    wrote on last edited by
    #22

    @JonB said in Serial communication:

    Sorry, I don't believe that. Start with:
    qDebug() << int(m_responseStatus) << int(Response::Status::DISABLE) << 0x1A;

    Result:
    0 26 26

    JonBJ 1 Reply Last reply
    0
    • D Damian7546

      @JonB said in Serial communication:

      Sorry, I don't believe that. Start with:
      qDebug() << int(m_responseStatus) << int(Response::Status::DISABLE) << 0x1A;

      Result:
      0 26 26

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

      @Damian7546
      So you have your answer from the first 2 outputs. 0 != 26, the two values being compared are indeed not equal/the same.

      Behaviour is quite correct given your m_request.mid(2,1).toInt(nullptr, 16);, which (QByteArray::toInt()) is quite incorrect to use on your byte array containing a byte with value \x16 (26). toInt() is not for use in your case, as you do not have a string representation of an integer to convert.

      D 1 Reply Last reply
      0
      • JonBJ JonB

        @Damian7546
        So you have your answer from the first 2 outputs. 0 != 26, the two values being compared are indeed not equal/the same.

        Behaviour is quite correct given your m_request.mid(2,1).toInt(nullptr, 16);, which (QByteArray::toInt()) is quite incorrect to use on your byte array containing a byte with value \x16 (26). toInt() is not for use in your case, as you do not have a string representation of an integer to convert.

        D Offline
        D Offline
        Damian7546
        wrote on last edited by
        #24

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

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