Qt实现XYModem协议(八)

server/2024/10/18 23:29:07/

1 概述

  XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K,它以1024字节一块来传输数据。YMODEM也是一种XMODEM的实现。它包括XMODEM-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。

本文利用C++实现XYModem-1K协议,并利用Qt串口类QSerialPort实现数据读写。

3 实现

YModemFileRecver_5">3.7 XYModemFileRecver

该模块实现XYModem协议在线程中异步接收文件。

YModemFileRecver_8">3.7.1 XYModemFileRecver定义

class QSerialPort;
class XYModemRecvFile;
class XYModemFileRecver : public QObject
{Q_OBJECT
public:explicit XYModemFileRecver(QSerialPort *serial, bool isYModem = true,QObject *parent = nullptr);~XYModemFileRecver();signals:void start_recv(QString const& fileName);void stop_recv();void cancel_recv();void gotFileSize(quint64 filesize);void progressInfo(quint32 blockNumber, quint64 bytesOfSend);void finished();void error(QString const& e);
public:void start(QString const& fileName);void stop();void cancel();
private:QThread workerThread;XYModemRecvFile* worker;
};

公共接口:

  • 开始XYModem协议接收文件
  • startXModem 开始XModem协议接收文件
  • stop 停止接收
  • cancel 取消接收

信号:

  • gotFileSize 文件大小信号
  • progressInfo 传输进度信号
  • error 出错信号
  • finished 传输结束信号

重载接口:

  • write 向串口写数据
  • read 从串口读取数据
  • get_code 读取操作码
  • do_recv 接收数据并验证

YModemRecvFile_56">3.7.2 XYModemRecvFile实现

3.7.2.1 构造函数/析构函数
XYModemFileRecver::XYModemFileRecver(QSerialPort *serial, bool isYModem, QObject *parent): QObject(parent)
{worker = new XYModemRecvFile(serial);serial->moveToThread(&workerThread);worker->moveToThread(&workerThread);connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);if(isYModem)connect(this, &XYModemFileRecver::start_recv, worker, &XYModemRecvFile::startYModem);elseconnect(this, &XYModemFileRecver::start_recv, worker, &XYModemRecvFile::startXModem);connect(this, &XYModemFileRecver::stop_recv, worker, &XYModemRecvFile::stop);connect(this, &XYModemFileRecver::cancel_recv, worker, &XYModemRecvFile::cancel);connect(worker, &XYModemRecvFile::gotFileSize, this, &XYModemFileRecver::gotFileSize);connect(worker, &XYModemRecvFile::progressInfo, this, &XYModemFileRecver::progressInfo);connect(worker, &XYModemRecvFile::finished, this, &XYModemFileRecver::finished);connect(worker, &XYModemRecvFile::error, this, &XYModemFileRecver::error);workerThread.start();
}XYModemFileRecver::~XYModemFileRecver()
{workerThread.quit();workerThread.wait();
}

函数说明:

  • 构造函数
    • 将serial和worker移动到workerThread线程
    • 连接信号和槽函数,如果YModem,start_recv连接startYModem,否则连接startXModem
    • 启动线程
  • 析构函数
    • 退出线程
    • 等待线程退出
3.7.2.2 start/stop/cancel
void XYModemFileRecver::start(QString const& fileName)
{emit start_recv(fileName);
}void XYModemFileRecver::stop()
{worker->stop();
}void XYModemFileRecver::cancel()
{worker->cancel();
}

函数说明:

  • start 发送信号start_send开始文件传输
  • stop 调用work函数stop停止操作
  • cancel 发送信号cancel_send取消文件传输操作
    Qt实现XYModem协议(七)

http://www.ppmy.cn/server/15296.html

相关文章

4月24日,每日信息差

第一、福岛第一核电站于当地时间 4 月 24 日 17 时 15 分重新启动核污染水排放,此前在当日 10 时 43 分左右,核电站内供电系统部分停止运行导致正在进行的核污染水排海作业中断 第二、微软、谷歌等科技巨头与非营利组织 Thorn 和 All Tech Is Human 合作…

【触摸案例-触摸事件介绍 Objective-C语言】

一、触摸事件 1.接下来,我们来说这个,触摸事件, iOS当中的事件,可以分为三大类: 1)触摸事件 2)加速计事件 3)远程控制事件 事件呢,这个里面呢,使用app的过程当中呢,产生各种各样的事件,事件呢,分为三大类,在iOS里边儿啊,分为三大类,首先,有一个叫做触摸事…

C++并发编程

基本介绍 线程 C98标准没有直接提供原生的多线程支持 在C98中&#xff0c;并没有像后来的C11标准中那样的<thread>库或其他直接的多线程工具 然而&#xff0c;这并不意味着在C98中无法实现多线程。开发者通常会使用平台特定的API&#xff08;如Windows的线程API或POSI…

服用5年份筑基丹 - Vue篇

前言 修仙之道&#xff0c;千回百转&#xff0c;每一步都充满了玄妙与机遇。在这条充满奇幻的修仙之路上&#xff0c;有一物至关重要&#xff0c;那便是筑基丹。此丹&#xff0c;凝聚了修仙者多年的心血与智慧&#xff0c;是修炼道路上的重要助力。 今日&#xff0c;我有幸得…

车载终端丨车载平板丨车载平板电脑丨提升车队管理水平

随着电商、互联网和智能制造等行业的快速发展&#xff0c;物流需求不断增加&#xff0c;车载终端作为物流企业管理的重要工具&#xff0c;具有广泛的市场需求。车载平板是一种集成了计算机和显示屏的设备&#xff0c;可以用于车辆管理、车队调度、运输监控等方面&#xff0c;可…

LangChain入门:24.通过Baby AGI实现自动生成和执行任务

随着 ChatGPT 的崭露头角,我们迎来了一种新型的代理——Autonomous Agents(自治代理或自主代理)。 这些代理的设计初衷就是能够独立地执行任务,并持续地追求长期目标。 在 LangChain 的代理、工具和记忆这些组件的支持下,它们能够在无需外部干预的情况下自主运行,这在真…

工业相机和镜头参数和选型

工业相机和镜头参数和选型 文章目录 工业相机和镜头参数和选型前言一、相机参数解释和选型1.相机参数1.1快门-shutter1.2曝光-exposure1.3增益-gain1.4 感光芯片类型&#xff08;CCD/CMOS&#xff09;1.5 感光芯片&#xff08;靶面&#xff09;尺寸1.6 分辨率1.7 像元尺寸1.8 帧…

东方博宜1009 - 数组逆序

题目描述 给你 nn 个整数&#xff0c;将其逆序输出。 输入 第一行一个整数 nn &#xff08;3 \le n \le 1003≤n≤100)代表数的个数。 第二行 nn 个整数&#xff08;空格隔开&#xff09;&#xff08;这些数在 0 \sim 10^60∼106 之间)。 输出 nn 个整数&#xff08;空格…