Qt实现Kermit协议(四)

3 实现

3.3 KermitRecvFile

该模块实现了Kermit接收文件功能。

序列图如下:
序列图

3.3.1 KermitRecvFile定义

class QSerialPort;
class KermitRecvFile : public QObject, public Kermit
{Q_OBJECT
public:explicit KermitRecvFile(QSerialPort *serial, QObject *parent = nullptr);public slots:void start(QString const& fileName);void stop();void cancel();signals:void gotFileSize(quint64 filesize);void progressInfo(quint32 blockNumber, quint64 bytesOfSend);void error(QString const& e);void finished();
protected:int write(char const *data, int size) override;int read(char *data, int size) override;char getc() override;void on_init(int seq, const char* data, int size) override;void on_data(int seq, const char* data, int size) override;void on_break(int seq, const char* data, int size) override;
private:void saveData(const char* data, int size);bool singled() { return signal_; }void doSignal() { signal_ = true; };
private:QSerialPort* serial_;volatile bool signal_;State state_ = SSNUL;QFile file_;int timeMs = 0;quint32 blockNumber = 0;quint64 bytesOfRecv_ = 0;};

公共接口:

  • start 开始接收文件
  • stop 停止传输文件
  • cancel 中断传输文件

信号:

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

重载接口:

  • on_init 处理开始包
  • on_data 处理数据包
  • on_break 处理中断包
  • write 向串口写数据
  • read 从串口读数据
  • getc 从串口读取一个字符

其它接口:

  • saveData 解码数据并保存

3.3.2 KermitRecvFile实现

3.3.2.1 start/stop/cancel
void KermitRecvFile::start(QString const& fileName)
{file_.setFileName(fileName);while(!singled() && state_ != SSBRK)recv_packet();emit finished();serial_->moveToThread(QApplication::instance()->thread());
}void KermitRecvFile::stop() { doSignal(); }void KermitRecvFile::cancel() { state_ = SSBRK; }

函数说明:

  • start
    • 循环接收数据包,直到收到停止或终止信号
    • 发送结束信号
  • stop 发送停止信号
  • cancel 设置终止信号
3.3.2.2 on_init/on_data/on_break
void KermitRecvFile::on_init(int seq, const char* data, int size)
{Kermit::on_init(seq, data, size);state_ = SSINT;
}void KermitRecvFile::on_data(int seq, const char* data, int size)
{Q_UNUSED(seq)if(state_ == SSINT){file_.open(QIODevice::WriteOnly);state_ = SSDAT;}if(file_.isOpen()){saveData(data, size);send_ack(seq);}
}void KermitRecvFile::on_break(int seq, const char* data, int size)
{Q_UNUSED(seq)Q_UNUSED(data)Q_UNUSED(size)state_ = SSBRK;
}

函数说明:

  • on_init 处理开始包,设置状态为初始
  • on_data
    • 如果是初始状态,则打开文件,将状态设置为接收数据状态
    • 保存数据
  • on_break 设置状态为中断
3.2.2.3 write/read/getc/saveData
int KermitRecvFile::write(char const *data, int size) {return serial_->write(data, size);
}int KermitRecvFile::read(char *data, int size)
{int read_size = 0;while(!singled() && read_size < size){if(serial_->waitForReadyRead(timeMs))read_size += serial_->read(data + read_size, size - read_size);}return read_size;
}char KermitRecvFile::getc()
{char c = NUL;while(!singled()){if(serial_->waitForReadyRead(timeMs)){serial_->getChar(&c);break;}}return c;
}void KermitRecvFile::saveData(const char* data, int size)
{char d[MaxLen];char a;int index = 0;int recvSize = 0;while(index < size){index += decode(data + index, a);d[recvSize++] = a;}file_.write(d, recvSize);blockNumber++;bytesOfRecv_ += recvSize;emit progressInfo(blockNumber, bytesOfRecv_);
}

函数说明:

  • write 向串口写数据
  • read 从串口读取指定大小数据
  • getc 从串口读取一个字符
  • saveData
    • 解码数据
    • 保存数据
    • 发送进度信号

Qt实现Kermit协议(三)
未完待续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/300253.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSON在线工具使用文档

功能支持 ctrls json格式化游览器本地保存ctrla ctrlc 自动检测选中范围是否是全选&#xff0c;然后按照格式化方式添加到粘贴板中json 粘贴JSON自动格式化json可视化修改json压缩复制json层级折叠json关键key 搜索(自动提示高亮)满足某些近视的可以自行调整字体大小, 并且会游…

鸿蒙内核源码分析 (内存管理篇) | 虚拟内存全景图是怎样的

初始化整个内存 OsSysMemInitOsMainmain从 main() 跟踪可看内存部分初始化是在 OsSysMemInit() 中完成的。 UINT32 OsSysMemInit(VOID) {STATUS_T ret;OsKSpaceInit();//内核空间初始化ret OsKHeapInit(OS_KHEAP_BLOCK_SIZE);// 内核动态内存初始化 512K if (ret ! LOS_OK…

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案 大家好 我是寸铁&#x1f44a; 总结了一篇【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天在登录redis时&#xff0c…

容器和K8s常见概念

【容器】 1、Open Container Initiative&#xff08;OCI&#xff09;&#xff1a;制定和推动容器格式和运行时的开放标准。容器运行时需要遵循此标准。主要的产出物包括&#xff1a; OCI Image Specification: 定义容器镜像格式的规范&#xff0c;统一描述容器镜像的内容和结…

mysql 连接查询和子查询

学习了mysql基本查询&#xff0c; 接着学习连接查询和子查询。 4&#xff0c;连接查询 连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询&#xff0c;主要包括内连接、外连接等。通过连接运算符可以实现多个表查询。在关系数据库管理系统中&#xff0c;表建…

X年后,ChatGPT会替代底层程序员吗?

能不能替代&#xff0c;真的很难说&#xff0c;因为机器换掉人&#xff0c;这其实是一个伦理问题。 其实说白了&#xff0c;任何行业在未来都会被AI或多或少的冲击到&#xff0c;因为ChatGPT做为一个可以持续提升智能的AI&#xff0c;在某些方面的智能程度超过人类并不是什么难…

练习 17 Web [极客大挑战 2019]PHP

常见的网站源码备份文件名和后缀&#xff0c;反序列化攻击 unserialize()&#xff1a;wakeup绕过&#xff0c;private类以及属性序列化后的%00修改 开靶机 提到”备份“ 那看看有没有backup.php啥的 如果网站存在备份文件&#xff0c;常见的备份文件后缀名有&#xff1a;“.gi…

ExpiringMap使用详解

一、ExpiringMap概述 ExpiringMap项目地址&#xff1a;https://github.com/jhalterman/expiringmap 1、ExpiringMap简介 针对一些小体量的项目&#xff0c;存储的数据量也不是很大&#xff08;如校验码&#xff09;的情况下&#xff0c;使用 Redis会增加系统的复杂性和维护难度…

【论文阅读笔记】Customized Segment Anything Model for Medical Image Segmentation

1.论文介绍 Customized Segment Anything Model for Medical Image Segmentation 医学图像分割的自定义分割模型 2023年 arXiv Paper Code 2.摘要 本文提出SAMed&#xff0c;医学图像分割的一般解决方案。与以往的方法不同&#xff0c;SAMed基于大规模图像分割模型Segment A…

探索数据结构:特殊的双向队列

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 双向队列的定义 **双向队列(double‑ended queue)**是一种特殊的队列…

【并发编程系列】使用 CompletableFuture 实现并发任务处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

python买铅笔 2024年3月青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析

目录 python买铅笔 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python买铅笔 2024年3月 python编程等级考试级编程题 一、题目要求 1、编…

Bigtable [OSDI‘06] 论文阅读笔记

原论文&#xff1a;Bigtable: A Distributed Storage System for Structured Data (OSDI’06) 1. Introduction Bigtable 是一种用于管理结构化数据的分布式存储系统&#xff0c;可扩展到非常大的规模&#xff1a;数千台服务器上的数据量可达 PB 级别&#xff0c;同时保证可靠…

《QT实用小工具·十七》密钥生成工具

1、概述 源码放在文章末尾 该项目主要用于生成密钥&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain.h" #include "qmessag…

js计算器实现

文章目录 1. 演示效果2. 分析思路3. 代码实现 1. 演示效果 2. 分析思路 给每个按钮添加点击事件&#xff0c;使用eval()进行计算。 3. 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&q…

低代码革新:软件开发的未来潜力与创新路径探索

过去的一年&#xff0c;挑战与机遇并存。人们一边忧虑市场经济下行所带来的新的增长难题、裁员危机&#xff0c;一边惊叹于AIGC、量子技术等领域不断涌现新的创新成果。 时代发生了改变&#xff0c;传统“互联网”的模式已走入尾声&#xff0c;新一轮的科技革命与产业变革正在到…

学习 MongoDB:打开强大的数据库技术大门

一、基本概念 MongoDB 是一个基于分布式文件存储的文档数据库&#xff0c;由 C 语言编写。它旨在为 Web 应用提供可扩展的高性能数据存储解决方案。 相信MySQL我们非常的熟悉&#xff0c;那么MySQL的表结构与MongoDB的文档结构进行类比的话可能更好理解MongoDB。 MySQL的数据…

Windows下Docker安装Kafka3+集群

编写 docker-compose.yaml 主要参照&#xff1a;https://www.cnblogs.com/wangguishe/p/17563274.html version: "3"services:kafka1:image: bitnami/kafka:3.4.1container_name: kafka1environment:- KAFKA_HEAP_OPTS-Xmx1024m -Xms1024m- KAFKA_ENABLE_KRAFTyes- K…

类和对象(上)

目录 类的定义&#xff1a; 类的访问限定符及封装&#xff1a; 访问限定符&#xff1a; 封装&#xff1a; 类的作用域&#xff1a; 类的实例化&#xff1a; ​编辑 类对象模型&#xff1a; 类对象的大小与存储方式&#xff1a; this指针&#xff1a; this指针的引出&…

《债务与国家的崛起》西方民主制度的金融起源 - 三余书屋 3ysw.net

债务与国家的崛起&#xff1a;西方民主制度的金融起源 你好&#xff0c;今天我们来聊聊由英国知名经济与金融历史学家詹姆斯麦克唐纳所著的《债务与国家的崛起》这本书。19世纪世界历史上发生了一次巨变&#xff0c;即“大分流”。当时西方通过工业革命实现了科技和经济的飞速…