Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.
-
@Rika said in Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.:
while (serialPort->waitForReadyRead(1000)){
ba.append(serialPort->readAll());
}How do you actually know when the whole picture was received?
You need a protocol. For example you could first send an int containing the image size and then send the actual image. This way the receiver would know how many bytes to receive. -
@jsulm Thank you for replying. I tried sending images from a PC (using Realterm to send pictures), on my Pi 4, I ran the receiving program and got the images. Could the error be in the sending program?
@Rika
Hi
There is no real error as such. it's just that data will come as multiple read and
the current code will then save only the last seen data piece as imagexx.jpg
and the image will always appear broken.
Overlooked waitForReadyRead in slotThat is why @jsulm want you to include the size of the image so we can know we got all data.
-
@Rika
Hi
There is no real error as such. it's just that data will come as multiple read and
the current code will then save only the last seen data piece as imagexx.jpg
and the image will always appear broken.
Overlooked waitForReadyRead in slotThat is why @jsulm want you to include the size of the image so we can know we got all data.
@mrjj said in Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.:
There is no real error as such. it's just that data will come as multiple read and
the current code will then save only the last seen data piece as imagexx.jpgAre you sure?
QByteArray ba; while (serialPort->waitForReadyRead(1000)){ ba.append(serialPort->readAll()); }
-
@mrjj said in Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.:
There is no real error as such. it's just that data will come as multiple read and
the current code will then save only the last seen data piece as imagexx.jpgAre you sure?
QByteArray ba; while (serialPort->waitForReadyRead(1000)){ ba.append(serialPort->readAll()); }
@jsulm
Hi
Àhh on first ready signal, it will call the slot and the
waitForReadyRead + loop will then read all remaining data.
Ok that should actually do it.
( if really never breaks the while loop) -
@jsulm
Hi
Àhh on first ready signal, it will call the slot and the
waitForReadyRead + loop will then read all remaining data.
Ok that should actually do it.
( if really never breaks the while loop)@mrjj Yes, possible that the timeout kicks in and terminates the loop before everything was received.
-
@mrjj Yes, possible that the timeout kicks in and terminates the loop before everything was received.
@jsulm
Hi
I also wonder if that would happen if image was say 1 MB.But it should be clear to poster if its called more than once with the
qDebug()<<ba.size()<<"sizeeeee:"; -
@jsulm Thank you for replying. I tried sending images from a PC (using Realterm to send pictures), on my Pi 4, I ran the receiving program and got the images. Could the error be in the sending program?
@Rika I suggest you implement the receiving part in a proper way: without mixing asynchronous and synchronous ways to read data. Remove the loop from serial::on_readdata(). Put QByteArray ba as member variable in the class. Accumulate data in ba untill you got all data.
-
wrote on 27 Jul 2020, 08:25 last edited by
-
@Rika Please read https://doc.qt.io/qt-5/qserialport.html#waitForReadyRead "This function blocks until new data is available for reading and the readyRead() signal has been emitted" and my previous post (no need for waitForReadyRead and the loop).
-
@Rika I suggest you implement the receiving part in a proper way: without mixing asynchronous and synchronous ways to read data. Remove the loop from serial::on_readdata(). Put QByteArray ba as member variable in the class. Accumulate data in ba untill you got all data.
wrote on 27 Jul 2020, 08:29 last edited by Rika@jsulm You mean this?
void serial::on_readdata() { QByteArray ba(serialPort->readAll()); qDebug()<<ba.size()<<"sizeeeee:"; QFile newDoc("/home/pi/Desktop/imagexx.jpg"); if(newDoc.open(QIODevice::WriteOnly)){ newDoc.write(ba); } newDoc.close(); }
-
@jsulm You mean this?
void serial::on_readdata() { QByteArray ba(serialPort->readAll()); qDebug()<<ba.size()<<"sizeeeee:"; QFile newDoc("/home/pi/Desktop/imagexx.jpg"); if(newDoc.open(QIODevice::WriteOnly)){ newDoc.write(ba); } newDoc.close(); }
@Rika No, not like this. Please read my post above "Put QByteArray ba as member variable in the class. Accumulate data in ba untill you got all data."
-
@Rika No, not like this. Please read my post above "Put QByteArray ba as member variable in the class. Accumulate data in ba untill you got all data."
-
void serial::on_readdata() { ba.apend(serialPort->readAll()); qDebug()<<ba.size()<<"sizeeeee:"; if (ba.size() == imageSize) { QFile newDoc("/home/pi/Desktop/imagexx.jpg"); if(newDoc.open(QIODevice::WriteOnly)){ newDoc.write(ba); } newDoc.close(); } }
-
void serial::on_readdata() { ba.apend(serialPort->readAll()); qDebug()<<ba.size()<<"sizeeeee:"; if (ba.size() == imageSize) { QFile newDoc("/home/pi/Desktop/imagexx.jpg"); if(newDoc.open(QIODevice::WriteOnly)){ newDoc.write(ba); } newDoc.close(); } }
-
@Rika
So it only shows
qDebug()<<ba.size()<<"sizeeeee:";
1 time with size 241 ? -
@mrjj No, the last time was 241. My old way it also received only 241 bytes, so I was thinking of the possibility of an error sent by the program.
@Rika said in Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.:
No, the last time was 241.
So you do get mutiple
qDebug()<<ba.size()<<"sizeeeee:";
messages ? -
@Rika said in Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.:
No, the last time was 241.
So you do get mutiple
qDebug()<<ba.size()<<"sizeeeee:";
messages ? -
@mrjj
144 sizeeeee:
160 sizeeeee:
176 sizeeeee:
192 sizeeeee:
208 sizeeeee:
224 sizeeeee:
240 sizeeeee:
241 sizeeeee:@Rika As I already said: you have to accumulate all these data in ba and when you got everything then you store it in the file.
Again the code:void serial::on_readdata() { ba.apend(serialPort->readAll()); qDebug()<<ba.size()<<"sizeeeee:"; if (ba.size() == imageSize) { QFile newDoc("/home/pi/Desktop/imagexx.jpg"); if(newDoc.open(QIODevice::WriteOnly)){ newDoc.write(ba); } newDoc.close(); } }
-
@mrjj
144 sizeeeee:
160 sizeeeee:
176 sizeeeee:
192 sizeeeee:
208 sizeeeee:
224 sizeeeee:
240 sizeeeee:
241 sizeeeee:@Rika
But it stops at 241 every time?Maybe its due to data.
Could you try in your sent functionvoid 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.
12/42