Qt实现XYModem协议(八)

news/2024/5/9 19:37:12

1 概述

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

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

3 实现

3.7 XYModemFileRecver

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

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 接收数据并验证

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.mrgr.cn/p/02538717

相关文章

RabbitMQ(高级)笔记

一、生产者可靠性 (1)生产者重连(不建议使用) logging:pattern:dateformat: MM-dd HH:mm:ss:SSSspring:rabbitmq:virtual-host: /hamllport: 5672host: 192.168.92.136username: hmallpassword: 123listener:simple:prefetch: 1c…

Ubuntu16.04搭建webrtc服务器

本人查阅无数资料,历时3周搭建成功 一、服务器组成 AppRTC 房间+Web服务器 https://github.com/webrtc/apprtcCollider 信令服务器,在AppRTC源码里CoTurn coturn打洞+中继服务器 Nginx 服务器,用于Web访问代理和Websocket代理。AppRTC 房间+Web服务器使用python+js语言 App…

235 基于matlab的时频盲源分离(TFBSS)算法

基于matlab的时频盲源分离(TFBSS)算法,TFBSS用空间频率分布来分离非平稳信号,可以分离具有不同时频分布的源信号,也能够分离具有相同谱密度但时频分布不同的高斯源。同时,该算法在时频域上局域化源信号能量…

玩转MongoDB 从入门到实战 pdf mongodb从入门到商业实战pdf下载

玩转MongoDB 从入门到实战 pdf mongodb从入门到商业实战pdf下载 转载huatechinfo2023-09-14 20:28:05 文章标签mongodb数据库数据文章分类MongoDB数据库阅读数277目录MongoDB 数据库介绍01、MongoDB简介1、性能高 2、支持分布式 3、安装和部署容易 4、便于开发 5、NOSQL与SQL…

CPPTest实例分析(C++ Test)

1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架,用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式,并且可以轻松添加新的输出格式。 CppTest下载地址:下载地址1  下载地址2 下面结合实例分析下CppTest如…

git 基础知识(全能版)

文章目录 一 、git 有三个分区二、git 基本操作1、克隆—git clone2、拉取—git fetch / git pull3、查看—git status / git diff3.1 多人开发代码暂存技巧 本地代码4、提交—git add / git commit / git push5、日志—git log / git reflog6、删除—git rm ‘name’7、撤销恢…

vue-解决background-image:url不显示问题

如上图所示,需求是给网页设置背景图,但实际效果是图片无法显示,已经确认地址是没问题的,网上教程有些是让在路径作为参数包裹在require方法里面,但还是未起作用。 折腾许久之后,发现了解决办法,只需要给div设置高度即可<style> .background {height: 120vh; } <…

数据结构与算法解题-20240426

这里写目录标题 面试题 08.04. 幂集367. 有效的完全平方数192. 统计词频747. 至少是其他数字两倍的最大数718. 最长重复子数组 面试题 08.04. 幂集 中等 幂集。编写一种方法&#xff0c;返回某集合的所有子集。集合中不包含重复的元素。 说明&#xff1a;解集不能包含重复的子…

CSS基础语法

CSS 标签选择器 内嵌式改变标签样式 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><!-- 属于标签选择器 --><style>p{font - size: 16px;color: red;}</style></head><bo…

Angular创建项目

Angular创建项目 文章目录 Angular创建项目1. 创建项目1.1 直接安装1.2 跳过npm i安装 2. 运行程序 1. 创建项目 ng new 项目名称 1.1 直接安装 ng new angulardemo --同时会安装依赖包&#xff0c;执行的命令就是npm i 1.2 跳过npm i安装 ng new angulardemo --skip-inst…

dotnet 8 版本与银河麒麟V10和UOS系统的 glibc 兼容性

刚刚好 dotnet 8 的 glibc 版本足够旧,可以运行本文记录于 2024.04.26 如果你阅读本文时间距离本文记录时间过远,可能本文记录的信息已失效 dotnet 根据 dotnet 的 supported-os 文档记录,当前的 dotnet 8 是 8.0.4 版本,官方说明是支持 Debian 11 及以上版本 实际测试可以…

从零入门区块链和比特币(第一期)

欢迎来到我的区块链与比特币入门指南&#xff01;如果你对区块链和比特币感兴趣&#xff0c;但不知道从何开始&#xff0c;那么你来对地方了。本博客将为你提供一个简明扼要的介绍&#xff0c;帮助你了解这个领域的基础知识&#xff0c;并引导你进一步探索这个激动人心的领域。…

U盘格式转换GPT格式转回DOS

当前格式 fdisk /dev/sdb# 在 fdisk 提示符下&#xff0c;输入以下命令删除分区&#xff1a; d # 选择要删除的分区编号&#xff08;如 1、2 等&#xff09; w开始转换 [rootnode-24 ~]# fdisk /dev/sdbWelcome to fdisk (util-linux 2.37.4). Changes will remain in memory o…

RabbitMQ发布确认和消息回退(6)

概念 发布确认原理 生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker就会发送一个确认给生产者(包含消…

第一个大型汽车ITU-T车载语音通话质量实验室投入使用

中国汽车行业蓬勃发展&#xff0c;尤其是新能源汽车风起云涌&#xff0c;无论是国内还是海外需求旺盛的趋势下&#xff0c;除乘用车等紧凑型车外&#xff0c;中型汽车如MPV、小巴、小型物流车&#xff0c;大型汽车如重卡、泥头车等亦加入了手机互联、智驾的科技行列&#xff0c…

LT9611UXC双端口 MIPI DSI/CSI 转 HDMI2.0,带音频

1. 说明 LT9611UXC 是一款高性能 MIPI DSI/CSI 至 HDMI2.0 转换器。MIPI DSI/CSI 输入具有可配置的单端口或双端口&#xff0c;具有 1 个高速时钟通道和 1~4 个高速数据通道&#xff0c;工作速率最高为 2Gbps/通道&#xff0c;可支持高达 16Gbps 的总带宽。 LT9611UXC 支持突发…

四:物联网ARM开发

一&#xff1a;ARM体系结构概述 1&#xff1a;控制外设led灯还有一些按键这些就要用到gpio&#xff0c;采集传感器的数据需要adc进行转化数据格式&#xff0c;特殊的外设和传感器是通过特殊的协议接口去进行连接的比如一些轴传感器和主控器的连接是通过spi&#xff0c;IIC 控制…

深入解析YOLOv2

深入解析YOLOv2 引言 目标检测是计算机视觉中的一个核心问题&#xff0c;它旨在识别图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。近年来&#xff0c;随着深度学习技术的发展&#xff0c;目标检测领域取得了巨大的进步。YOLO&#xff08;You Only Look Once&a…

maven-idea新建和导入项目

全局配置 新建项目 需要新建的文件夹 src/testsrc/test/javasrc/main/java 注&#xff1a;1、新建Java-class&#xff0c;输入.com.hello.hellomaven 2、快捷键psvm显示 public static void main(String[] args) {.... } package com.hello;public class hellomaven {publ…

Pytorch 的实际应用 学习笔记

一. 模型的下载 weights为false时则为没有提前经过训练的模型&#xff0c;为true时则经过了提前训练 vgg16_false torchvision.models.vgg16(weightsFalse) vgg16_true torchvision.models.vgg16(weightsTrue) 打印 二. 模型的修改 &#xff08;1&#xff09;添加操作 …