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. copy unsigned char array into QByteArray ..... problems
QtWS25 Last Chance

copy unsigned char array into QByteArray ..... problems

Scheduled Pinned Locked Moved Solved General and Desktop
16 Posts 4 Posters 6.5k Views
  • 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.
  • O Offline
    O Offline
    o6a6r9v1p
    wrote on last edited by
    #1

    I am sending 20 bytes of data using serial port.
    these bytes come from different blocks, some are int, some are bits; putting them together into 20 bytes structure. the values change with time, they are not constants.

    the structure defined as "unsigned char array"

    But QSerialPort() uses QByte Array as the input, it is const type.

    is there any way to assign unsigned char array to QByte Array
    OR is there any way to copy from array to QByte Array.
    code is shown below:

    unsigned char buf[20];
    
    QByteArray  writeData;
    .......
    .......
    for(i=0;i<64;i++){
       writeData =QByteArray::fromRawData(buf, sizeof(buf));    //ERROR here
    }
    .......
    const qint64 bytesWritten = m_serialPort->write(writeData);
    
    

    i tried some other ways, but of no use.

    Thanks,

    J.HilkJ raven-worxR 2 Replies Last reply
    0
    • O o6a6r9v1p

      I am sending 20 bytes of data using serial port.
      these bytes come from different blocks, some are int, some are bits; putting them together into 20 bytes structure. the values change with time, they are not constants.

      the structure defined as "unsigned char array"

      But QSerialPort() uses QByte Array as the input, it is const type.

      is there any way to assign unsigned char array to QByte Array
      OR is there any way to copy from array to QByte Array.
      code is shown below:

      unsigned char buf[20];
      
      QByteArray  writeData;
      .......
      .......
      for(i=0;i<64;i++){
         writeData =QByteArray::fromRawData(buf, sizeof(buf));    //ERROR here
      }
      .......
      const qint64 bytesWritten = m_serialPort->write(writeData);
      
      

      i tried some other ways, but of no use.

      Thanks,

      J.HilkJ Offline
      J.HilkJ Offline
      J.Hilk
      Moderators
      wrote on last edited by J.Hilk
      #2

      hi @o6a6r9v1p
      QSerialport is derived from QioDevice, therefore write has at least 3 overwrites(those from the base class)

      • qint64 write(const char *data, qint64 maxSize)
      • qint64 write(const char *data)
      • qint64 write(const QByteArray &byteArray)

      So you can indeed pass it a char array, no need to convert it into a QByteArray

      That said, are you sure, about what you do ?

      because in here

      for(i=0;i<64;i++){
         writeData =QByteArray::fromRawData(buf, sizeof(buf));    //ERROR here
      }
      

      while the loop is running, buf will not change, It changes only if you do some hacky stuff!
      E.g threads without mutex, processEvent calls etc.


      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.

      O 1 Reply Last reply
      3
      • O o6a6r9v1p

        I am sending 20 bytes of data using serial port.
        these bytes come from different blocks, some are int, some are bits; putting them together into 20 bytes structure. the values change with time, they are not constants.

        the structure defined as "unsigned char array"

        But QSerialPort() uses QByte Array as the input, it is const type.

        is there any way to assign unsigned char array to QByte Array
        OR is there any way to copy from array to QByte Array.
        code is shown below:

        unsigned char buf[20];
        
        QByteArray  writeData;
        .......
        .......
        for(i=0;i<64;i++){
           writeData =QByteArray::fromRawData(buf, sizeof(buf));    //ERROR here
        }
        .......
        const qint64 bytesWritten = m_serialPort->write(writeData);
        
        

        i tried some other ways, but of no use.

        Thanks,

        raven-worxR Offline
        raven-worxR Offline
        raven-worx
        Moderators
        wrote on last edited by
        #3

        @o6a6r9v1p
        it's not clear what the whole code of yours does.

        Also make sure that you read the docs about QByteArray::fromRawData():

        Constructs a QByteArray that uses the first size bytes of the data array. The bytes are not copied. The QByteArray will contain the data pointer. The caller guarantees that data will not be deleted or modified as long as this QByteArray and any copies of it exist that have not been modified

        so use the constructor instead.

        Otherwise simply cast your char pointer to the target type. The data behind it doesn't change.

        --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
        If you have a question please use the forum so others can benefit from the solution in the future

        1 Reply Last reply
        3
        • O Offline
          O Offline
          o6a6r9v1p
          wrote on last edited by
          #4

          Thanks to all,
          in the test code, i am initializing the array with integers.
          then i tried to assign or copy into QByteArray.
          while copy/paste, missed the lines.

          int i;
          for(i=0;i<20;i++){
              wbuf[i]=i;
          }
           m_writeData =QByteArray::fromRawData(wbuf, sizeof(wbuf));
          
          

          how to change the above line of code.

          Thanks.

          1 Reply Last reply
          0
          • J.HilkJ J.Hilk

            hi @o6a6r9v1p
            QSerialport is derived from QioDevice, therefore write has at least 3 overwrites(those from the base class)

            • qint64 write(const char *data, qint64 maxSize)
            • qint64 write(const char *data)
            • qint64 write(const QByteArray &byteArray)

            So you can indeed pass it a char array, no need to convert it into a QByteArray

            That said, are you sure, about what you do ?

            because in here

            for(i=0;i<64;i++){
               writeData =QByteArray::fromRawData(buf, sizeof(buf));    //ERROR here
            }
            

            while the loop is running, buf will not change, It changes only if you do some hacky stuff!
            E.g threads without mutex, processEvent calls etc.

            O Offline
            O Offline
            o6a6r9v1p
            wrote on last edited by
            #5

            @J.Hilk hi,
            passed buf[] as you told, as a parameter to QSerialPort(), but it gives same error.
            The code is:

            for(i=0;i<20;i++){
                wbuf[i]=i;
            }
            
            const qint64 bytesWritten = serPort->write(wbuf));
            

            the error is:

            invalid conversion from  "unsigned char*" to "const char*"
            

            can you point to examples or doc pages, if possible.

            Thanks.

            jsulmJ 1 Reply Last reply
            0
            • O o6a6r9v1p

              @J.Hilk hi,
              passed buf[] as you told, as a parameter to QSerialPort(), but it gives same error.
              The code is:

              for(i=0;i<20;i++){
                  wbuf[i]=i;
              }
              
              const qint64 bytesWritten = serPort->write(wbuf));
              

              the error is:

              invalid conversion from  "unsigned char*" to "const char*"
              

              can you point to examples or doc pages, if possible.

              Thanks.

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @o6a6r9v1p Please read what @raven-worx wrote (hint: casting)

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              O 1 Reply Last reply
              3
              • jsulmJ jsulm

                @o6a6r9v1p Please read what @raven-worx wrote (hint: casting)

                O Offline
                O Offline
                o6a6r9v1p
                wrote on last edited by
                #7

                @jsulm
                hi,
                can we do it the way it is done C?
                or is it different in C++?

                I am not good in C++.

                Thanks.

                jsulmJ J.HilkJ 2 Replies Last reply
                0
                • O o6a6r9v1p

                  @jsulm
                  hi,
                  can we do it the way it is done C?
                  or is it different in C++?

                  I am not good in C++.

                  Thanks.

                  jsulmJ Offline
                  jsulmJ Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  @o6a6r9v1p

                  const qint64 bytesWritten = serPort->write(reinterpret_cast<char*>(wbuf)));
                  

                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                  O 1 Reply Last reply
                  1
                  • O o6a6r9v1p

                    @jsulm
                    hi,
                    can we do it the way it is done C?
                    or is it different in C++?

                    I am not good in C++.

                    Thanks.

                    J.HilkJ Offline
                    J.HilkJ Offline
                    J.Hilk
                    Moderators
                    wrote on last edited by
                    #9

                    @o6a6r9v1p
                    take a look here

                    http://www.cplusplus.com/doc/tutorial/typecasting/

                    you can use c-style casting, but you're encuraged to use the cpp variants


                    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
                    • jsulmJ jsulm

                      @o6a6r9v1p

                      const qint64 bytesWritten = serPort->write(reinterpret_cast<char*>(wbuf)));
                      
                      O Offline
                      O Offline
                      o6a6r9v1p
                      wrote on last edited by
                      #10

                      @jsulm
                      hi,
                      Thanks for the word. this line was used, think i am wrong some where.

                      const qint64 bytesWritten = serPort->write(const QByteArray ((unsigned char*) wbuf));
                      

                      where did i miss?

                      Thanks,

                      jsulmJ 1 Reply Last reply
                      0
                      • O o6a6r9v1p

                        @jsulm
                        hi,
                        Thanks for the word. this line was used, think i am wrong some where.

                        const qint64 bytesWritten = serPort->write(const QByteArray ((unsigned char*) wbuf));
                        

                        where did i miss?

                        Thanks,

                        jsulmJ Offline
                        jsulmJ Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on last edited by jsulm
                        #11

                        @o6a6r9v1p Why do you create a byte array? @J-Hilk already said here that this is not needed.
                        What is wrong in your code: remove the const before QByteArray. You should learn more about C++.

                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                        O 2 Replies Last reply
                        0
                        • jsulmJ jsulm

                          @o6a6r9v1p Why do you create a byte array? @J-Hilk already said here that this is not needed.
                          What is wrong in your code: remove the const before QByteArray. You should learn more about C++.

                          O Offline
                          O Offline
                          o6a6r9v1p
                          wrote on last edited by
                          #12

                          @jsulm
                          hi,
                          sending data bytes in certain order.
                          we use a structure of bytes.

                          jsulmJ 1 Reply Last reply
                          0
                          • O o6a6r9v1p

                            @jsulm
                            hi,
                            sending data bytes in certain order.
                            we use a structure of bytes.

                            jsulmJ Offline
                            jsulmJ Offline
                            jsulm
                            Lifetime Qt Champion
                            wrote on last edited by
                            #13

                            @o6a6r9v1p Again: there is NO need for QByteArray.
                            This line should work as well, did you try?

                            const qint64 bytesWritten = serPort->write(reinterpret_cast<char*>(wbuf)));
                            

                            https://forum.qt.io/topic/113070/qt-code-of-conduct

                            O 1 Reply Last reply
                            0
                            • jsulmJ jsulm

                              @o6a6r9v1p Why do you create a byte array? @J-Hilk already said here that this is not needed.
                              What is wrong in your code: remove the const before QByteArray. You should learn more about C++.

                              O Offline
                              O Offline
                              o6a6r9v1p
                              wrote on last edited by
                              #14

                              @jsulm
                              removed const as told.
                              still i am getting:

                              invaild conversion from unsigned char* to const char* error.
                              

                              i know c programming, but not good in c++,

                              thanks,

                              jsulmJ 1 Reply Last reply
                              0
                              • O o6a6r9v1p

                                @jsulm
                                removed const as told.
                                still i am getting:

                                invaild conversion from unsigned char* to const char* error.
                                

                                i know c programming, but not good in c++,

                                thanks,

                                jsulmJ Offline
                                jsulmJ Offline
                                jsulm
                                Lifetime Qt Champion
                                wrote on last edited by
                                #15

                                @o6a6r9v1p You should read more carefully - I already showed you what you need to do.

                                1. Why do you want to use QByteArray? It is not needed. QByteArray does not care about any order - it is the order you give it.
                                2. You need to cast unsigned char* to char*. See my previous posts to see how, I don't want to write it again and again.

                                https://forum.qt.io/topic/113070/qt-code-of-conduct

                                1 Reply Last reply
                                2
                                • jsulmJ jsulm

                                  @o6a6r9v1p Again: there is NO need for QByteArray.
                                  This line should work as well, did you try?

                                  const qint64 bytesWritten = serPort->write(reinterpret_cast<char*>(wbuf)));
                                  
                                  O Offline
                                  O Offline
                                  o6a6r9v1p
                                  wrote on last edited by
                                  #16

                                  @jsulm
                                  hi,
                                  i under stood that line in wrongly. in the place of <char *>, i have used const QByteArray.
                                  Now i got the point after going trough the type casting page, adviced by you.

                                  Now it is working.
                                  Thanks to all of you.

                                  1 Reply Last reply
                                  0

                                  • Login

                                  • Login or register to search.
                                  • First post
                                    Last post
                                  0
                                  • Categories
                                  • Recent
                                  • Tags
                                  • Popular
                                  • Users
                                  • Groups
                                  • Search
                                  • Get Qt Extensions
                                  • Unsolved