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

    @jsulm
    This conversion doesn't work.

    class Response
    {
    public:
        enum class Status : quint8{
             DISABLE = 0x1A,
        };
        Response();
    };
    
    

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

    m_responseStatus = static_cast<Response::Status>(m_request.mid(2,1).toInt(nullptr, 16));
        qDebug() << "m_responseStatus: " << m_request.mid(2,1);
    
        if(Response::Status::DISABLE == m_responseStatus)
            qDebug() << "ok convert";
        else
            qDebug() << "bad convert";
    
    

    Problem is in toInt conversion:

    qDebug() << "m_responseStatus: " << m_request.mid(2,1);
    qDebug() << "m_responseStatus: " << m_request.mid(2,1).toInt(nullptr, 16);
    

    result:
    m_responseStatus: "\x1A"
    m_responseStatus: 0

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

    @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 1 Reply Last reply
    0
    • 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 Online
              J.HilkJ Online
              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 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