首页 > 解决方案 > 无法在通过 UART 连接到 Zigbee 的 2 个 Raspberry 之间发送和接收图像

问题描述

我有 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();
}

标签: qtuartzigbee

解决方案


  serialPort->setFlowControl(QSerialPort::NoFlowControl); 

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

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

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


推荐阅读