我有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();
}
答案 0 :(得分:0)
serialPort->setFlowControl(QSerialPort::NoFlowControl);
我看到发送端未使用流控制。您绝对需要这样做,以免XBee模块上的缓冲区溢出。没有流量控制,您最终将发送无法传输的数据。我的猜测是Real Term启用了流控制,这就是为什么您的数据到达的原因。
您还应该在接收器上启用它,尽管不太可能无法跟上输入的数据。
我不知道接收端API的详细信息,但是应该为接收数据的延迟做好准备。在考虑传输“完成”并保存文件之前,您可以等待1-2秒的静默时间(同时将数据接收并追加到缓冲区中)。