无法通过UART连接到Zigbee的2个Raspberry之间发送和接收图像

时间:2020-07-23 10:03:46

标签: qt uart zigbee

我有2个Raspberry Pi4通过UART连接到Zigbee,我编写了程序在两个设备之间进行接收和发送。我的程序可以非常精确地发送和接收字符数据,但是当我从照片发送数据时,该程序永远无法接收到足够的数据。我尝试了连接到Zigbee的PC,并通过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();
}

1 个答案:

答案 0 :(得分:0)

  serialPort->setFlowControl(QSerialPort::NoFlowControl); 

我看到发送端未使用流控制。您绝对需要这样做,以免XBee模块上的缓冲区溢出。没有流量控制,您最终将发送无法传输的数据。我的猜测是Real Term启用了流控制,这就是为什么您的数据到达的原因。

您还应该在接收器上启用它,尽管不太可能无法跟上输入的数据。

我不知道接收端API的详细信息,但是应该为接收数据的延迟做好准备。在考虑传输“完成”并保存文件之前,您可以等待1-2秒的静默时间(同时将数据接收并追加到缓冲区中)。