【发布时间】:2020-11-13 00:40:27
【问题描述】:
我有 2 个 Raspberry Pi4 通过 UART 连接到 Zigbee,我编写了在两个设备之间接收和发送的程序。我的程序可以非常准确地发送和接收字符数据,但是当我从照片发送数据时,程序永远不会收到足够的数据。我尝试将 PC 连接到 Zigbee 并通过 RealTerm 将图片发送到 Pi,在 Pi 上我收到了照片。这里有什么问题?或者有没有人有另一种方式在通过 UART 连接到 Zigbee 的 2 个 Raspberry 之间发送照片?非常感谢。
节目发送:
#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:";
}
}
程序读取:
#include "ui_serial.h"
#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()));
}
}
void serial::on_readdata()
{
QByteArray ba;
while (serialPort->waitForReadyRead(1000)){
ba.append(serialPort->readAll());
}
qDebug()<<ba.size()<<"sizeeeee:";
QFile newDoc("/home/pi/Desktop/imagexx.jpg");
if(newDoc.open(QIODevice::WriteOnly)){
newDoc.write(ba);
}
newDoc.close();
}
【问题讨论】:
-
考虑使用信号和槽来处理通信,而不是使用
waitForReadyRead(1000)的阻塞方法。 -
除上述评论外,您的代码还有许多问题。首先,您永远不会检查
serialPort->write(ba)返回的值——我认为不能保证所有数据都已写入。然而,更重要的是,您永远不会让接收者知道需要多少数据。您可能需要考虑使用QDataStream来帮助(反)序列化。 -
@scopchanov 感谢您的回复,我正在考虑将
waitForReadyRead(1000)替换为while (! Port-> atEnd ()),这是个好办法吗? -
这是完全相同的方法。为了进一步帮助您,我应该问:您知道轮询和中断之间的区别吗?
-
@G.M.谢谢回复,我会考虑的。