Unsolved Unable to send and receive images between 2 Raspberry connected to Zigbee via UART.
-
@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) -
@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:"; -
@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.
-
-
@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).
-
@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."
-
@jsulm Sorry, I don't really understand what you mean. Can you give an example with 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(); } }
-
@jsulm I tried it and it failed, I sent 31021 bytes and always received 241 bytes.
-
@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 ? -
@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(); } }
-
@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.
-
@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).
-
@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