【问题标题】:Unable to send and receive images between 2 Raspberry connected to Zigbee via UART无法在通过 UART 连接到 Zigbee 的 2 个 Raspberry 之间发送和接收图像
【发布时间】: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-&gt;write(ba) 返回的值——我认为不能保证所有数据都已写入。然而,更重要的是,您永远不会让接收者知道需要多少数据。您可能需要考虑使用QDataStream 来帮助(反)序列化。
  • @scopchanov 感谢您的回复,我正在考虑将waitForReadyRead(1000) 替换为while (! Port-&gt; atEnd ()),这是个好办法吗?
  • 这是完全相同的方法。为了进一步帮助您,我应该问:您知道轮询和中断之间的区别吗?
  • @G.M.谢谢回复,我会考虑的。

标签: qt uart zigbee


【解决方案1】:
  serialPort->setFlowControl(QSerialPort::NoFlowControl); 

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

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

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

【讨论】:

    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多