Qt实现XYModem协议(七)

embedded/2024/11/25 18:34:28/

1 概述

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

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

3 实现

YModemFileSender_5">3.6 XYModemFileSender

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

YModemFileSender_8">3.6.1 XYModemFileSender定义

class QSerialPort;
class XYModemSendFile;
class XYModemFileSender : public QObject
{Q_OBJECT
public:explicit XYModemFileSender(QSerialPort *serial, bool isYModem = true,QObject *parent = nullptr);~XYModemFileSender();signals:void start_send(QString const& fileName);void stop_send();void cancel_send();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;XYModemSendFile* worker_;
};

公共接口:

  • start 开始XYModem协议发送文件
  • stop 停止发送
  • cancel 取消发送

信号:

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

YModemFileSender_49">3.6.2 XYModemFileSender实现

3.6.2.1 构造函数/析构函数
XYModemFileSender::XYModemFileSender(QSerialPort *serial, bool isYModem, QObject *parent): QObject(parent)
{XYModemSendFile* worker = new XYModemSendFile(serial);serial->moveToThread(&workerThread);worker->moveToThread(&workerThread);connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);if(isYModem)connect(this, &XYModemFileSender::start_send, worker, &XYModemSendFile::startYModem);elseconnect(this, &XYModemFileSender::start_send, worker, &XYModemSendFile::startXModem);connect(this, &XYModemFileSender::stop_send, worker, &XYModemSendFile::stop);connect(this, &XYModemFileSender::cancel_send, worker, &XYModemSendFile::cancel);connect(worker, &XYModemSendFile::gotFileSize, this, &XYModemFileSender::gotFileSize);connect(worker, &XYModemSendFile::progressInfo, this, &XYModemFileSender::progressInfo);connect(worker, &XYModemSendFile::finished, this, &XYModemFileSender::finished);connect(worker, &XYModemSendFile::error, this, &XYModemFileSender::error);worker_ = worker;workerThread.start();
}XYModemFileSender::~XYModemFileSender()
{workerThread.quit();workerThread.wait();
}

函数说明:

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

函数说明:

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

http://www.ppmy.cn/embedded/12772.html

相关文章

Typora使用的一些记录(自用)

Typora 是一个伪装成文本编辑器的浏览器。当你按下 Shift F12 快捷键或者右键检查元素时,页面会弹出一个基于 Chrome 的开发者工具栏。 1、Typora快捷键 标题(Ctrl1(2,3,4,5,6)) ps:分别是一级标题到六…

基于文件流操作文件系统

stream 文件流ScannerWriter遍历目录删除指定文件把目标文件复制为源文件小结 文件流 文件的内容本质上都是来自于硬盘,而硬盘由操作系统管理. 使用java来操作文件,就要用到java的api.这里涉及一系列的类: 字节流: InputStream和OutputStream是以操作字节为单位(二进制文件). …

项目经理面试的常见问题及回答技巧

关于项目经理的面试,很多人都会紧张,那么项目经理面试会遇到哪些常见问题呢?应如何应对呢?下面的一些关于项目经理面试问题及回答技巧,希望能对你有所帮助。 一、自我介绍 各位面试官好,我叫某某&#x…

TCP三次握手详解

目录 什么是TCP TCP头格式组成 三次握手 第一次握手 第二次握手 第三次握手 三次握手的好处 为什么需要三次握手? 什么是TCP 传输控制协议(TCP)是Internet一个重要的传输层协议。TCP提供面向连接、可靠、有序、字节流传输服务。 面向连接: 应用…

Excel 冻结前几行

Excel中有冻结首航和冻结首列的选项,但是如果想冻结前几行该怎么操作? 冻结首行或冻结首列 视图 -> 冻结窗格 -> 冻结首行或冻结首列 冻结前几行或前几列 视图 -> 冻结窗格 -> 冻结拆分窗格 具体冻结几行和几列取决于当前选中的单元格。…

基于Qt的二维码生成与识别

基于Qt的二维码生成与识别 一、获取QZxing开源库 1.通过封装的QZxing开源库生成和识别二维码,下载地址:GitCode - 开发者的代码家园https://gitcode.com/mirrors/ftylitak/qzxing/tree/master。 2.下载解压后,使用Qt Creator xx&#xff0…

Qt Android 动态加载动态库失败

问题描述 经过了七七四十九个劫难后程序终于稳定运行起来了,正当我以为完美时,问题又找上门了,QML 里面的二维码图片加载不起来了,这个图片还不是本地图片,是实时生成的。 开始的时候并没有下面日志输出,…

WPF Dispatcher使用invoke造成死锁

在WPF中,使用Dispatcher.Invoke()方法同步调用可以导致死锁,尤其是在不正确处理UI线程和其他线程间的同步时。这里有一个示例来说明这种情况: 假设你有一个WPF应用程序,其中主UI线程需要等待另一个工作线程完成某个任务。而工作线…