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.5k 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.
  • jsulmJ jsulm

    @Damian7546 Something like this. But better don't use c-style casts:

    m_responseStatus = static_cast<Response::Status>(m_request.mid(2,1).toInt(nullptr, 16));
    
    D Offline
    D Offline
    Damian7546
    wrote on last edited by Damian7546
    #20

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