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. Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.
Forum Updated to NodeBB v4.3 + New Features

Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.

Scheduled Pinned Locked Moved Unsolved General and Desktop
42 Posts 4 Posters 8.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.
  • R Rika

    @jsulm I have made your way, the above is the result from qDebug (). It only received 241 bytes so file imagexxx.jpg was not created. (my imageSize= 31021).

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

    @Rika said in Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.:

    @jsulm I have made your way, the above is the result from qDebug (). It only received 241 bytes so file imagexxx.jpg was not created. (my imageSize= 31021).

    at this point, you're not getting away with a simple I've tried that, it does not work.

    @jsulm is absolutely correct. Show us your actual code


    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.

    mrjjM R 2 Replies Last reply
    1
    • mrjjM mrjj

      @Rika
      But it stops at 241 every time?

      Maybe its due to data.
      Could you try in your sent function

      void serial::on_pushButton_2_clicked()
      {
      
      
              QByteArray ba;
              ba.fill('A', 1000);
              if(serialPort->isOpen()==true){
                  serialPort->write(ba);
                  qDebug()<<ba.size()<<"size_send:";
              }
      }
      

      and see if that changes how you the reading goes.
      This just sends 1000 A.

      Also i wonder if write will copy the data and then send / if write sent it all there as else we have the issue of the sent buffer running out of scope.

      R Offline
      R Offline
      Rika
      wrote on last edited by
      #25

      @mrjj I tried with 1000 A, received only 190

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

        @Rika said in Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.:

        @jsulm I have made your way, the above is the result from qDebug (). It only received 241 bytes so file imagexxx.jpg was not created. (my imageSize= 31021).

        at this point, you're not getting away with a simple I've tried that, it does not work.

        @jsulm is absolutely correct. Show us your actual code

        mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by
        #26

        @J-Hilk
        Do you know if write blocks ?
        QByteArray ba; // local
        ba.fill('A', 1000);
        if(serialPort->isOpen()==true){
        serialPort->write(ba); // blocks here ? as ba is by reference

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

          @Rika said in Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.:

          @jsulm I have made your way, the above is the result from qDebug (). It only received 241 bytes so file imagexxx.jpg was not created. (my imageSize= 31021).

          at this point, you're not getting away with a simple I've tried that, it does not work.

          @jsulm is absolutely correct. Show us your actual code

          R Offline
          R Offline
          Rika
          wrote on last edited by
          #27

          @J-Hilk

          Send:

          #include "ui_serial.h"
          #include <QDebug>
          #include <QBuffer>
          #include <QPixmap>
          #include <QFile>
          
          
          serial::serial(QWidget *parent) :
              QMainWindow(parent),
              ui(new Ui::serial)
          {
              ui->setupUi(this);
          
              serialPort = new QSerialPort(this);
              serialPort->setPortName("ttyAMA0");
              serialPort->setBaudRate(QSerialPort::Baud115200);
              serialPort->setDataBits(QSerialPort::Data8);
              serialPort->setStopBits(QSerialPort::OneStop);
              serialPort->setFlowControl(QSerialPort::NoFlowControl);
              serialPort->open(QIODevice::ReadWrite);
          
              if (serialPort->isOpen() == true){
                  qDebug() <<"Port Opened....";
                  connect(serialPort, SIGNAL(readyRead()), this, SLOT(on_readdata()));
              }
          }
          void serial::on_pushButton_2_clicked()
          {
              QFile* imageFile = new QFile("/home/pi/Desktop/image.jpg");
                  imageFile->open(QIODevice::ReadOnly);
                  QByteArray ba = imageFile->readAll();
                  imageFile->close();
                  delete imageFile;
                  if(serialPort->isOpen()==true){
                      serialPort->write(ba);
                      qDebug()<<ba.size()<<"size_send:";
                  }
          }
          

          Rec:

          #include "serial.h"
          #include "ui_serial.h"
          #include <QtSerialPort/QSerialPort>
          #include <QDebug>
          #include <QBuffer>
          #include <QPixmap>
          #include <QFile>
          #include <QMessageBox>
          
          serial::serial(QWidget *parent) :
             QMainWindow(parent),
             ui(new Ui::serial)
          {
             ui->setupUi(this);
          
             serialPort = new QSerialPort(this);
             serialPort->setPortName("ttyAMA0");
             serialPort->setBaudRate(QSerialPort::Baud115200);
             serialPort->setDataBits(QSerialPort::Data8);
             serialPort->setStopBits(QSerialPort::OneStop);
             serialPort->setFlowControl(QSerialPort::NoFlowControl);
             serialPort->open(QIODevice::ReadWrite);
          
             if (serialPort->isOpen() == true){
                 qDebug() <<"Port Opened....";
                 connect(serialPort, SIGNAL(readyRead()), this, SLOT(on_readdata()));
             }
          
          }
          
          serial::~serial()
          {
             delete ui;
             serialPort->close();
          }
          
          
          void serial::on_readdata()
          {
             ba.append( serialPort->readAll());
             qDebug()<<ba.size()<<"sizeeeee:";
             if (ba.size() == 31021) {
                 QFile newDoc("/home/pi/Desktop/imagexx.jpg");
                     if(newDoc.open(QIODevice::WriteOnly)){
                         newDoc.write(ba);
                     }
                     newDoc.close();
             }
          //    ui->label->setText(ba);
          
          //      QPixmap b;
          //      if(b.loadFromData(ba,"JPG")){
          //          ui->label->setPixmap(b);
          //      }
          
          }
          
          
          1 Reply Last reply
          0
          • mrjjM mrjj

            @J-Hilk
            Do you know if write blocks ?
            QByteArray ba; // local
            ba.fill('A', 1000);
            if(serialPort->isOpen()==true){
            serialPort->write(ba); // blocks here ? as ba is by reference

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

            @mrjj IIRC, it's passed on to the OS during the write call and that copies the data. But I'm not entirely sure 😬


            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.

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

              @mrjj IIRC, it's passed on to the OS during the write call and that copies the data. But I'm not entirely sure 😬

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #29

              @J-Hilk
              Yeah i was wondering since its a board if that still happens as it would
              make sense we get cut if not.

              @Rika
              Can you try this

              void serial::on_pushButton_2_clicked()
              {
                      static QByteArray ba;
                      ba.fill('A', 1000);
                      if(serialPort->isOpen()==true){
                          serialPort->write(ba);
                          qDebug()<<ba.size()<<"size_send:";
                      }
              }
              

              and tell me if we still only get up to 190 bytes with the sizeeeee message.

              R 1 Reply Last reply
              1
              • mrjjM mrjj

                @J-Hilk
                Yeah i was wondering since its a board if that still happens as it would
                make sense we get cut if not.

                @Rika
                Can you try this

                void serial::on_pushButton_2_clicked()
                {
                        static QByteArray ba;
                        ba.fill('A', 1000);
                        if(serialPort->isOpen()==true){
                            serialPort->write(ba);
                            qDebug()<<ba.size()<<"size_send:";
                        }
                }
                

                and tell me if we still only get up to 190 bytes with the sizeeeee message.

                R Offline
                R Offline
                Rika
                wrote on last edited by
                #30

                @mrjj I tried, still only get 190.
                16 sizeeeee:
                32 sizeeeee:
                64 sizeeeee:
                64 sizeeeee:
                14 sizeeeee:

                mrjjM 1 Reply Last reply
                0
                • R Rika

                  @mrjj I tried, still only get 190.
                  16 sizeeeee:
                  32 sizeeeee:
                  64 sizeeeee:
                  64 sizeeeee:
                  14 sizeeeee:

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #31

                  @Rika
                  Good testing.
                  So even it says
                  qDebug()<<ba.size()<<"size_send:";
                  1000 size_send
                  you only get
                  5 lines of
                  16 sizeeeee:
                  32 sizeeeee:
                  64 sizeeeee:
                  64 sizeeeee:
                  14 sizeeeee:
                  ?

                  R 1 Reply Last reply
                  0
                  • mrjjM mrjj

                    @Rika
                    Good testing.
                    So even it says
                    qDebug()<<ba.size()<<"size_send:";
                    1000 size_send
                    you only get
                    5 lines of
                    16 sizeeeee:
                    32 sizeeeee:
                    64 sizeeeee:
                    64 sizeeeee:
                    14 sizeeeee:
                    ?

                    R Offline
                    R Offline
                    Rika
                    wrote on last edited by Rika
                    #32

                    @mrjj Sometimes 4 lines, sometimes 7 lines, but the total is 190 bytes. With 500-A, received only 230

                    mrjjM 1 Reply Last reply
                    0
                    • R Rika

                      @mrjj Sometimes 4 lines, sometimes 7 lines, but the total is 190 bytes. With 500-A, received only 230

                      mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by
                      #33

                      @Rika
                      Ok
                      if we do
                      ba.fill('A', 10);
                      do you then get all ?

                      R 1 Reply Last reply
                      0
                      • mrjjM mrjj

                        @Rika
                        Ok
                        if we do
                        ba.fill('A', 10);
                        do you then get all ?

                        R Offline
                        R Offline
                        Rika
                        wrote on last edited by
                        #34

                        @mrjj yes.

                        mrjjM 1 Reply Last reply
                        0
                        • R Rika

                          @mrjj yes.

                          mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by
                          #35

                          @Rika
                          So it seems data get cut over some size.

                          What Os is running on the boards ?

                          Also maybe Zigbee has some sort of max transfer size ?

                          R 1 Reply Last reply
                          0
                          • mrjjM mrjj

                            @Rika
                            So it seems data get cut over some size.

                            What Os is running on the boards ?

                            Also maybe Zigbee has some sort of max transfer size ?

                            R Offline
                            R Offline
                            Rika
                            wrote on last edited by
                            #36

                            @mrjj I use raspbian. I tried using a PC connected to zigbee and sent photos to my Pi4 + Zigbee with Realterm, my Pi4 received the photos. I think the error is in the program sends the data.

                            1 Reply Last reply
                            0
                            • J.HilkJ Offline
                              J.HilkJ Offline
                              J.Hilk
                              Moderators
                              wrote on last edited by
                              #37

                              well, lets narrow it down,
                              write returns a quint64 with the actual number of bytes written to the serialport, what does that return ?

                              void serial::on_pushButton_2_clicked()
                              {
                                      static QByteArray ba;
                                      ba.fill('A', 1000);
                                      if(serialPort->isOpen()==true){
                                          quint64 send = serialPort->write(ba);
                                          qDebug()<<send << " of" << ba.size()<<"size_send:";
                                      }
                              }
                              

                              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.

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

                                well, lets narrow it down,
                                write returns a quint64 with the actual number of bytes written to the serialport, what does that return ?

                                void serial::on_pushButton_2_clicked()
                                {
                                        static QByteArray ba;
                                        ba.fill('A', 1000);
                                        if(serialPort->isOpen()==true){
                                            quint64 send = serialPort->write(ba);
                                            qDebug()<<send << " of" << ba.size()<<"size_send:";
                                        }
                                }
                                
                                R Offline
                                R Offline
                                Rika
                                wrote on last edited by
                                #38

                                @J-Hilk 1000 of 1000 size.

                                J.HilkJ 1 Reply Last reply
                                0
                                • R Rika

                                  @J-Hilk 1000 of 1000 size.

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

                                  @Rika well,
                                  to make sure your 2nd application is not simply very late in its creation/startup process, try clicking the button a 2nd time, see if something changes :D

                                  After that, time for a serial port listing device, to check what is actually transferred


                                  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.

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

                                    @Rika well,
                                    to make sure your 2nd application is not simply very late in its creation/startup process, try clicking the button a 2nd time, see if something changes :D

                                    After that, time for a serial port listing device, to check what is actually transferred

                                    mrjjM Offline
                                    mrjjM Offline
                                    mrjj
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #40

                                    @J-Hilk
                                    When i goggle Zigbee , i do see max payload mentioned.
                                    Do you think that could be the cause here ?
                                    I never used Zigbee so not sure if its even an issue.

                                    J.HilkJ 1 Reply Last reply
                                    1
                                    • mrjjM mrjj

                                      @J-Hilk
                                      When i goggle Zigbee , i do see max payload mentioned.
                                      Do you think that could be the cause here ?
                                      I never used Zigbee so not sure if its even an issue.

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

                                      @mrjj uh, I should read the opening post more clearly,

                                      You're right, that is most likely the issue, ZigBee is a low data transfer protocol and from what my quick google search told me, limited to about 100 - 200 bytes, which fits exactly here

                                      for a quick and dirty test, we could split the test byte array and send it delayed, that should work

                                      void serial::on_pushButton_2_clicked()
                                      {
                                              static QByteArray ba;
                                                 int index(0);
                                                 ba.fill('A', 1000);
                                                 if(serialPort->isOpen()==true){
                                                     QTimer *t = new QTimer();
                                                     auto sendSection = [=,&index]()->void{
                                                         serialPort->write(ba.data() + index * 100, 100);
                                                         index ++;
                                                         if(index == 10)
                                                             t->deleteLater();
                                                     };
                                                     QObject::connect(t, &QTimer::timeout, sendSection);
                                                     t->start(1000);
                                              //       quint64 send = serialPort->write(ba);
                                                     qDebug()<< ba.size()<<"size_send:";
                                                 }
                                      }
                                      

                                      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
                                      2
                                      • R Offline
                                        R Offline
                                        Rika
                                        wrote on last edited by
                                        #42

                                        @mrjj @J-Hilk Sorry for my late reply. The problem is when I try to send from PC with Realterm (Pc is also connected to Zigbee), on Pi4 I still get pictures.

                                        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