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. Problem transmitting '0x20' via serial port
Forum Updated to NodeBB v4.3 + New Features

Problem transmitting '0x20' via serial port

Scheduled Pinned Locked Moved Solved General and Desktop
12 Posts 5 Posters 1.0k 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.
  • A Offline
    A Offline
    armorex
    wrote on 8 May 2020, 12:10 last edited by
    #1

    Hi. I am developing an application to update the firmware of an embedded device. It has a custom bootloader which requires an encrypted file to be sent via serial. The process works with TeraTerm when i submit a binary file at 9600 baud rate and updates the firmware on the device.

    Problem:

    When I try sending the same file via code through a GUI qt interface, the resulting file isn't the same. I have used a logic analyzer to determine that it is skipping all the 0x20 values, which equal to a space in ASCII. The resulting file that is transmitted is EXACTLY the same number of bytes less as the number of 0x20 values in the original file.

    if(!firmwareFile.open(QIODevice::ReadOnly)){
            qDebug() << "Cannot open file";
        }
    
     QByteArray firmwareData;
     firmwareData = firmwareFile.readAll();
     qDebug()<< portName.write(firmwareData);
     portName.waitForBytesWritten(-1);
    qDebug() <<portName.bytesToWrite();
     portName.close();
    
    

    Serial port parameters:

    setBaudRate(QSerialPort::Baud9600);
    setStopBits(QSerialPort::OneStop);
    setParity(QSerialPort::NoParity);
    setFlowControl(QSerialPort::NoFlowControl);
    setDataBits(QSerialPort::Data8);

    The received resulting file has exactly 104 bytes less. And there are 104 times 0x20 values in the original binary file. I have tried to use QByteArray::toHex as well but that doesn't work too.

    alt text

    C J 2 Replies Last reply 8 May 2020, 14:16
    0
    • A armorex
      8 May 2020, 12:10

      Hi. I am developing an application to update the firmware of an embedded device. It has a custom bootloader which requires an encrypted file to be sent via serial. The process works with TeraTerm when i submit a binary file at 9600 baud rate and updates the firmware on the device.

      Problem:

      When I try sending the same file via code through a GUI qt interface, the resulting file isn't the same. I have used a logic analyzer to determine that it is skipping all the 0x20 values, which equal to a space in ASCII. The resulting file that is transmitted is EXACTLY the same number of bytes less as the number of 0x20 values in the original file.

      if(!firmwareFile.open(QIODevice::ReadOnly)){
              qDebug() << "Cannot open file";
          }
      
       QByteArray firmwareData;
       firmwareData = firmwareFile.readAll();
       qDebug()<< portName.write(firmwareData);
       portName.waitForBytesWritten(-1);
      qDebug() <<portName.bytesToWrite();
       portName.close();
      
      

      Serial port parameters:

      setBaudRate(QSerialPort::Baud9600);
      setStopBits(QSerialPort::OneStop);
      setParity(QSerialPort::NoParity);
      setFlowControl(QSerialPort::NoFlowControl);
      setDataBits(QSerialPort::Data8);

      The received resulting file has exactly 104 bytes less. And there are 104 times 0x20 values in the original binary file. I have tried to use QByteArray::toHex as well but that doesn't work too.

      alt text

      C Offline
      C Offline
      CP71
      wrote on 8 May 2020, 14:16 last edited by
      #2

      @armorex

      QSerialPort mSerial;
      QByteArray data;

      ...
      mSerial.write( data.data(), data.size() );
      …

      Hi.
      I don't know!
      I've never problem to send data with this code, try it.

      A 2 Replies Last reply 8 May 2020, 16:01
      0
      • A armorex
        8 May 2020, 12:10

        Hi. I am developing an application to update the firmware of an embedded device. It has a custom bootloader which requires an encrypted file to be sent via serial. The process works with TeraTerm when i submit a binary file at 9600 baud rate and updates the firmware on the device.

        Problem:

        When I try sending the same file via code through a GUI qt interface, the resulting file isn't the same. I have used a logic analyzer to determine that it is skipping all the 0x20 values, which equal to a space in ASCII. The resulting file that is transmitted is EXACTLY the same number of bytes less as the number of 0x20 values in the original file.

        if(!firmwareFile.open(QIODevice::ReadOnly)){
                qDebug() << "Cannot open file";
            }
        
         QByteArray firmwareData;
         firmwareData = firmwareFile.readAll();
         qDebug()<< portName.write(firmwareData);
         portName.waitForBytesWritten(-1);
        qDebug() <<portName.bytesToWrite();
         portName.close();
        
        

        Serial port parameters:

        setBaudRate(QSerialPort::Baud9600);
        setStopBits(QSerialPort::OneStop);
        setParity(QSerialPort::NoParity);
        setFlowControl(QSerialPort::NoFlowControl);
        setDataBits(QSerialPort::Data8);

        The received resulting file has exactly 104 bytes less. And there are 104 times 0x20 values in the original binary file. I have tried to use QByteArray::toHex as well but that doesn't work too.

        alt text

        J Offline
        J Offline
        JonB
        wrote on 8 May 2020, 14:17 last edited by JonB 5 Aug 2020, 14:18
        #3

        @armorex said in Problem transmitting '0x20' via serial port:

        I have tried to use QByteArray::toHex as well but that doesn't work too.

        What exactly do you mean by this? It sounds like you are suggesting QByteArray::toHex() doesn't cope with space character in the bytes??

        1 Reply Last reply
        1
        • K Offline
          K Offline
          kuzulis
          Qt Champions 2020
          wrote on 8 May 2020, 15:21 last edited by kuzulis 5 Aug 2020, 15:29
          #4

          You can use any of serial port sniffer to see a real output data flow to the serial port driver. Seems, you do something wrong, or, maybe, there are some noise on a line. You should not use serial communication without of CRC calculation.

          A 1 Reply Last reply 8 May 2020, 16:12
          2
          • C CP71
            8 May 2020, 14:16

            @armorex

            QSerialPort mSerial;
            QByteArray data;

            ...
            mSerial.write( data.data(), data.size() );
            …

            Hi.
            I don't know!
            I've never problem to send data with this code, try it.

            A Offline
            A Offline
            armorex
            wrote on 8 May 2020, 16:01 last edited by
            #5

            @CP71 Ok i will try it and let you know

            1 Reply Last reply
            1
            • K kuzulis
              8 May 2020, 15:21

              You can use any of serial port sniffer to see a real output data flow to the serial port driver. Seems, you do something wrong, or, maybe, there are some noise on a line. You should not use serial communication without of CRC calculation.

              A Offline
              A Offline
              armorex
              wrote on 8 May 2020, 16:12 last edited by
              #6

              @kuzulis said in Problem transmitting '0x20' via serial port:

              You can use any of serial port sniffer to see a real output data flow to the serial port driver. Seems, you do something wrong, or, maybe, there are some noise on a line. You should not use serial communication without of CRC calculation.

              I have already included a screenshot of a file that was made by the logic analyzer. Which gets gets the output from a physical serial port. You can see that the top file does not contain 0x20. The bottom (original) file, however does. I have tired it multiple times with the same output which eliminates the possibility of noise

              aha_1980A 1 Reply Last reply 8 May 2020, 16:32
              0
              • A armorex
                8 May 2020, 16:12

                @kuzulis said in Problem transmitting '0x20' via serial port:

                You can use any of serial port sniffer to see a real output data flow to the serial port driver. Seems, you do something wrong, or, maybe, there are some noise on a line. You should not use serial communication without of CRC calculation.

                I have already included a screenshot of a file that was made by the logic analyzer. Which gets gets the output from a physical serial port. You can see that the top file does not contain 0x20. The bottom (original) file, however does. I have tired it multiple times with the same output which eliminates the possibility of noise

                aha_1980A Offline
                aha_1980A Offline
                aha_1980
                Lifetime Qt Champion
                wrote on 8 May 2020, 16:32 last edited by
                #7

                Hi @armorex,

                99% surely the problem is in your code.

                But please tell us, which operating system, compiler and Qt version you use.

                I'd try to separate the problem in two parts:

                1. Make sure the file is read correctly. Check it before writing it to the serial port. BTW: How big is this file?
                2. Make sure the serial writing is done correctly. Start by writing a small buffer containing spaces and verify they are sent.

                If I were you, I'd not use waitForBytesWritten. It is unrelyable anyway, as the data is still buffered in the OS or driver level when Qt's buffer get empty. A better handshake is to send ACKs from the bootloader when when (a chunk of/all) data arrived.

                Regards

                Qt has to stay free or it will die.

                A 1 Reply Last reply 8 May 2020, 22:25
                2
                • C CP71
                  8 May 2020, 14:16

                  @armorex

                  QSerialPort mSerial;
                  QByteArray data;

                  ...
                  mSerial.write( data.data(), data.size() );
                  …

                  Hi.
                  I don't know!
                  I've never problem to send data with this code, try it.

                  A Offline
                  A Offline
                  armorex
                  wrote on 8 May 2020, 22:22 last edited by
                  #8

                  @CP71 said in Problem transmitting '0x20' via serial port:

                  @armorex

                  QSerialPort mSerial;
                  QByteArray data;

                  ...
                  mSerial.write( data.data(), data.size() );
                  …

                  Hi.
                  I don't know!
                  I've never problem to send data with this code, try it.

                  This worked! But now i don't understand why can't we use QByteArray directly and have to use data(). But at least it works now. Thanks!

                  C 1 Reply Last reply 9 May 2020, 07:23
                  1
                  • aha_1980A aha_1980
                    8 May 2020, 16:32

                    Hi @armorex,

                    99% surely the problem is in your code.

                    But please tell us, which operating system, compiler and Qt version you use.

                    I'd try to separate the problem in two parts:

                    1. Make sure the file is read correctly. Check it before writing it to the serial port. BTW: How big is this file?
                    2. Make sure the serial writing is done correctly. Start by writing a small buffer containing spaces and verify they are sent.

                    If I were you, I'd not use waitForBytesWritten. It is unrelyable anyway, as the data is still buffered in the OS or driver level when Qt's buffer get empty. A better handshake is to send ACKs from the bootloader when when (a chunk of/all) data arrived.

                    Regards

                    A Offline
                    A Offline
                    armorex
                    wrote on 8 May 2020, 22:25 last edited by
                    #9

                    @aha_1980 said in Problem transmitting '0x20' via serial port:

                    Hi @armorex,

                    99% surely the problem is in your code.

                    But please tell us, which operating system, compiler and Qt version you use.

                    I'd try to separate the problem in two parts:

                    1. Make sure the file is read correctly. Check it before writing it to the serial port. BTW: How big is this file?
                    2. Make sure the serial writing is done correctly. Start by writing a small buffer containing spaces and verify they are sent.

                    If I were you, I'd not use waitForBytesWritten. It is unrelyable anyway, as the data is still buffered in the OS or driver level when Qt's buffer get empty. A better handshake is to send ACKs from the bootloader when when (a chunk of/all) data arrived.

                    Regards

                    I had to use the blocking function because it wasn't transmitting all the data. It would stop in the middle. The file is 36349 bytes.

                    1 Reply Last reply
                    0
                    • A armorex
                      8 May 2020, 22:22

                      @CP71 said in Problem transmitting '0x20' via serial port:

                      @armorex

                      QSerialPort mSerial;
                      QByteArray data;

                      ...
                      mSerial.write( data.data(), data.size() );
                      …

                      Hi.
                      I don't know!
                      I've never problem to send data with this code, try it.

                      This worked! But now i don't understand why can't we use QByteArray directly and have to use data(). But at least it works now. Thanks!

                      C Offline
                      C Offline
                      CP71
                      wrote on 9 May 2020, 07:23 last edited by
                      #10

                      @armorex

                      You are welcome!
                      It is old code, so I don’t remember why I have used this way instead of .write( QbyteData ), maybe I have had same result! But I can’t say now because I don’t remember ;)

                      I don’t know how .write() functions work at low level, but QByteData is unicode chars container. This call receives a no unicode chars. Maybe the difference is this.

                      aha_1980A 1 Reply Last reply 9 May 2020, 07:28
                      0
                      • C CP71
                        9 May 2020, 07:23

                        @armorex

                        You are welcome!
                        It is old code, so I don’t remember why I have used this way instead of .write( QbyteData ), maybe I have had same result! But I can’t say now because I don’t remember ;)

                        I don’t know how .write() functions work at low level, but QByteData is unicode chars container. This call receives a no unicode chars. Maybe the difference is this.

                        aha_1980A Offline
                        aha_1980A Offline
                        aha_1980
                        Lifetime Qt Champion
                        wrote on 9 May 2020, 07:28 last edited by
                        #11

                        @CP71

                        I don’t know how .write() functions work at low level, but QByteData is unicode chars container.

                        No, that's wrong. QByteArray just holds Bytes without interpreting them.

                        So I really wonder why using the other write makes a difference.

                        Still the OP didn't answer my questions.

                        Regards

                        Qt has to stay free or it will die.

                        C 1 Reply Last reply 9 May 2020, 07:38
                        2
                        • aha_1980A aha_1980
                          9 May 2020, 07:28

                          @CP71

                          I don’t know how .write() functions work at low level, but QByteData is unicode chars container.

                          No, that's wrong. QByteArray just holds Bytes without interpreting them.

                          So I really wonder why using the other write makes a difference.

                          Still the OP didn't answer my questions.

                          Regards

                          C Offline
                          C Offline
                          CP71
                          wrote on 9 May 2020, 07:38 last edited by
                          #12

                          @aha_1980
                          Yes, sorry!
                          You are right, my mistake.
                          I don’t know why I was thinking at QChar :(

                          1 Reply Last reply
                          1

                          1/12

                          8 May 2020, 12:10

                          • Login

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