qt - 无法在通过 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();
}
解决方案
serialPort->setFlowControl(QSerialPort::NoFlowControl);
我看到发送端没有使用流量控制。您肯定需要这样做,以免 XBee 模块上的缓冲区溢出。如果没有流量控制,您最终会发送无法传输的数据。我的猜测是 Real Term 启用了流量控制,这就是您的数据到达的原因。
您还应该在接收器上启用它,尽管您不太可能跟上传入的数据。
我不知道接收端API的细节,但它应该为接收数据的延迟做好准备。在考虑传输“完成”并保存文件之前,您可以等待 1-2 秒的安静期(同时接收数据并将其附加到缓冲区)。
推荐阅读
- kotlin - 我在 kotlin 中放了令牌的地方
- python - 为什么在某些函数中可以访问全局变量而在其他函数中不能访问?
- mysql - 来自许多变量的 MySQL CONCAT_WS - 如何将查询限制为仅现有数据?
- sql-server - KC-SERVICES0089:无法运行计划任务 ClearExpiredClientInitialAccessTokens
- java - 应用程序被杀死时没有收到通知
- mysql - 在没有公共列的情况下连接 MYSQL 中的表
- python - python:带有简单ODE的pyABC-实例str和int之间不支持回溯错误<=
- elasticsearch - 弹性搜索重新索引。选择嵌套字段
- vb.net - WinForms中多个UserControl中使用一个DataTable作为源
- javascript - 错误:监听 EADDRINUSE:地址已在使用 :::3001 [Nodemon,Node.js]