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