当前位置: 首页 > news >正文

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协议(三)
未完待续…

相关文章:

Qt实现Kermit协议(四)

3 实现 3.3 KermitRecvFile 该模块实现了Kermit接收文件功能。 序列图如下&#xff1a; 3.3.1 KermitRecvFile定义 class QSerialPort; class KermitRecvFile : public QObject, public Kermit {Q_OBJECT public:explicit KermitRecvFile(QSerialPort *serial, QObject *…...

苏州金龙助力旅游客运加速蜕变

近日&#xff0c;北京铭悦旅游客运有限公司又迎来一批苏州金龙海格纯电动客车。&#xff08;以下简称北京铭悦旅游&#xff09;总经理郭保生在车辆交付时说到&#xff0c;“为迎接强劲复苏的旅游市场&#xff0c;要求旅游客运向绿色客运转型&#xff0c;以及人民对品质生活、美…...

头盔检测 | 基于Caffe-SSD目标检测算法实现的建筑工地头盔检测

项目应用场景 面向建筑工地头盔检测场景&#xff0c;使用深度学习 Caffe SSD 目标检测算法&#xff0c;基于 C 实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装 Caffe SSD(2) 执行训练 sh examples/Hardhat/SSD300/train_SSD300.sh (3) 部署算法 项目获取 h…...

Stable diffusion 加载扩展列表报错解决方法

项目场景&#xff1a; 在使用Stable diffusion webui时&#xff0c;使用扩展列表出现错误 问题描述 点击loadfrom后&#xff0c;出现加载扩展列表报错 原因分析&#xff1a; 下载的扩展的时候&#xff0c;都是github 的url&#xff0c;需要科学上网&#xff0c;如果不能科学…...

Git(8)之分支间同步特定提交

Git(8)之分支间同步特定提交 Author&#xff1a;Once Day Date&#xff1a;2024年4月7日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSDN博客 文章目录 Git(8)之分支间同步特定提交1. 分支间同步提交2. cherry-pick同步分支间的特定提交…...

万得AI算法工程师一面面试题6道|含解析

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天…...

蓝桥杯23年第十四届省赛-异或和之和|拆位、贡献法

题目链接&#xff1a; 蓝桥杯2023年第十四届省赛真题-异或和之和 - C语言网 (dotcpp.com) 1.异或和之和 - 蓝桥云课 (lanqiao.cn) 参考题解&#xff1a; 蓝桥杯真题讲解&#xff1a;异或和之和 &#xff08;拆位、贡献法&#xff09;-CSDN博客 洛谷P9236 [蓝桥杯 2023 省 A]…...

Unity进阶之路(1)回顾与思考

首先呢&#xff0c;博主在这里先反思一下自己这几个月&#xff0c;其实并没有多少进步。 在寒假中&#xff0c;博主几乎是独立编写了一个小程序的完整UI和一个Uniapp的雏形。那段时间是博主生产力最高的时间段。几乎是每天8点起来开始编写代码&#xff0c;晚上一直忙到很晚。 …...

【C语言】——指针八:指针运算笔试题解析

【C语言】——指针八&#xff1a;指针运算笔试题解析 一、题一二、题二三、题三四、题四五、题五六、题六七、题七 一、题一 //程序输出结果是什么 int main() {int a[5] { 1,2,3,4,5 };int* ptr (int*)(&a 1);printf("%d, %d", *(a 1), *(ptr - 1));return…...

JVM字节码与类的加载——class文件结构

文章目录 1、概述1.1、class文件的跨平台性1.2、编译器分类1.3、透过字节码指令看代码细节 2、虚拟机的基石&#xff1a;class文件2.1、字节码指令2.2、解读字节码方式 3、class文件结构3.1、魔数&#xff1a;class文件的标识3.2、class文件版本号3.3、常量池&#xff1a;存放所…...

小程序如何通过公众号发送新订单提醒

当客户在小程序上下单后&#xff0c;公众号会发送订单通知&#xff0c;这可以让管理员及时获知用户下单情况&#xff0c;方便及时处理订单和提供服务。下面是具体介绍如何设置公众号来发送订单服务通知。 方式一&#xff1a;通过采云公众号发送订单通知 此种方式是默认的通知…...

聊聊公众号最让我不爽的两个痛点

本文首发于 Python猫 微信公众号最让我不爽的地方有两个&#xff0c;而且有很多人虽然也不爽&#xff0c;却不知道原因。 本文想聊聊公众号的两个痛点&#xff0c;因为我经常收到私信问这两个问题&#xff0c;本文算是一次集中的回复吧。 第一个不爽的点是公众号会屏蔽外链&…...

【leetCode】2810. 故障键盘

文章目录 [2810. 故障键盘](https://leetcode.cn/problems/faulty-keyboard/)思路一&#xff1a;模拟代码&#xff1a;思路二&#xff1a;双端队列代码&#xff1a; 2810. 故障键盘 思路一&#xff1a;模拟 用StringBuilder来拼贴字符遍历字符串&#xff0c;如果遇到i,对拼贴好…...

xshell7连接ubuntu18.04

&#x1f3a1;导航小助手&#x1f3a1; 1.查看ubuntu IP2.开启openssh-server3.静态IP设置4.Xshell连接 1.查看ubuntu IP 输入下面命令查看IP ifconfig -a可以看到网卡是ens33&#xff0c;IP为192.168.3.180。 2.开启openssh-server 1、执行下句&#xff0c;下载SSH服务 s…...

真正的力量:实力与人际关系的平衡艺术

在当今社会&#xff0c;人们常常在追求个人发展和建立良好人际关系之间寻找平衡。有一种观点认为&#xff0c;“没有实力&#xff0c;就不要对别人好。不然&#xff0c;很容易被定义为讨好。”这句话在一定程度上揭示了实力与人际关系之间的微妙联系。本文将探讨这一观点的深层…...

Acwing.1388 游戏(区间DP对抗思想)

题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始&#xff0c;双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走&#xff0c;并给自己增加相应数字的分数。&#xff08;双初始分都是 0分&#xff09; 当所有数字都被…...

Numpy数组转换为csv文件

参考&#xff1a;Converting Numpy Array to CSV 在数据分析和处理中&#xff0c;经常会涉及到将数据从一个形式转换为另一个形式的操作。 其中&#xff0c;将Numpy数组转换为csv文件是一种常见的操作&#xff0c;因为csv文件是一种通用的数据存储格式&#xff0c;方便与其他软…...

替代安全指标(Surrogate Safety Measures (SSM) )

替代安全措施&#xff08;Surrogate Safety Measures (SSM) &#xff09;用于从数据中寻找接近碰撞&#xff0c;或可能发生&#xff08;但实际没有发生&#xff09;的碰撞事件。 SSM的两个合格标准&#xff1a; &#xff08;1&#xff09;它应该来自与碰撞直接相关的交通冲突&…...

usb_camera传输视频流编码的问题记录!

前言&#xff1a; 大家好&#xff0c;今天给大家分享的内容是&#xff0c;一个vip课程付费的朋友&#xff0c;在学习过程中遇到了一个usb采集的视频数据流&#xff0c;经过ffmpeg编码&#xff0c;出现了问题&#xff1a; 问题分析&#xff1a; 其实这个问题不难&#xff0c;关键…...

Linux安装nginx保姆级教程

文章目录 前言一、nginx安装&#xff08;保姆级教程&#xff09;1.安装nginx依赖2.安装wget3.创建nginx安装目录4.下载nginx5.查看下载好的nginx6.解压缩7.查看当前目录下的文件→进入nginx-1.8.0目录→查看当前目录下的文件8.安装nginx9.查看nginx安装目录并启动nginx10.网络请…...

leetcode-判断二分图

. - 力扣&#xff08;LeetCode&#xff09; 存在一个 无向图 &#xff0c;图中有 n 个节点。其中每个节点都有一个介于 0 到 n - 1 之间的唯一编号。给你一个二维数组 graph &#xff0c;其中 graph[u] 是一个节点数组&#xff0c;由节点 u 的邻接节点组成。形式上&#xff0c…...

算法day30 回溯6

332 重新安排行程 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必须从 JFK …...

分享three.js实现乐高小汽车

前言 Web脚本语言JavaScript入门容易&#xff0c;但是想要熟练掌握却需要几年的学习与实践&#xff0c;还要在弱类型开发语言中习惯于使用模块来构建你的代码&#xff0c;就像小时候玩的乐高积木一样。 应用程序的模块化理念&#xff0c;通过将实现隐藏在一个简单的接口后面&a…...

gpt的构造和原理

gpt是序列预测模型。 问答是通过确定问答格式样本训练出来的&#xff01;比如“Q&#xff1a;xxxx.A:xxx"本质还是根据前面的序列预测后面的序列。在自回归训练过程中&#xff0c;文本序列&#xff08;可能包含问题和紧随其后的答案&#xff09;被视为一个整体输入到模型…...

基于springboot实现教师人事档案管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现IT技术交流和分享平台系统演示 摘要 我国科学技术的不断发展&#xff0c;计算机的应用日渐成熟&#xff0c;其强大的功能给人们留下深刻的印象&#xff0c;它已经应用到了人类社会的各个层次的领域&#xff0c;发挥着重要的不可替换的作用。信息管理作为计算…...

K8S之Job和CronJob控制器

这里写目录标题 Job概念适用场景使用案例 CronJob概念适用场景使用案例 Job 概念 Job控制器用于管理Pod对象运行一次性任务&#xff0c;例如&#xff1a;对数据库备份&#xff0c;可以直接在k8s上启动一个mysqldump备份程序&#xff0c;也可以启动一个pod&#xff0c;这个pod…...

基于SSM的基于个人需求和地域特色的外卖推荐系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的基于个人需求和地域特色的外卖推荐系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…...

哈佛大学商业评论 --- 第三篇:真实世界中的增强现实

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 本文作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大…...

华为ICT七力助推文化产业新质生产力发展

创新起主导作用的新质生产力由新劳动者、新劳动对象、新劳动工具、新基础设施等四大要素共同构成&#xff0c;符合新发展理念的先进生产力质态&#xff1b;具有高科技、高能效、高质量等三大突出特征。而通过壮大新产业、打造新模式、激发新动能&#xff0c;新质生产力能够摆脱…...

FastGpt流程

1.知识库 引入文本——>数据清洗 最好将pdf/ppt/xx转换成文本&#xff0c;在文本里面进行数据清洗&#xff08;以防知识库删除后&#xff0c;数据清洗失效&#xff09; 可以插图&#xff0c;将图片通过网页检查F12查看路径放进去 或者直接在csdn放&#xff0c;直接复制链接…...

深圳教育科技网站建设/香港旺道旺国际集团

电子科大ACM团队&#xff0c;在学校教务处、学工部和团委等部门的大力支持下&#xff0c;在去年第34届ACM-ICPC国际大学生程序设计竞赛亚洲区域赛中&#xff0c;数学科学学院负责并组织六支队伍出战了六个赛区的比赛&#xff0c;最终获得四金、四银、四铜的辉煌战绩&#xff0c…...

企业网站建设的重要性和必要性/腾讯企点怎么注册

CentOS 下添加新硬盘并分区格式化1.先添加一块硬盘&#xff0c;并建立分区&#xff0c;格式化&#xff0c;然后挂载使用用 Fdisk &#xff0d;l 来查看当前状态下磁盘情况[rootlinux1 ~]# fdisk -lDisk/dev/hda: 5368 MB, 5368709120 bytes255heads, 63 sectors/track, 652 c…...

学校网站建设开发方案书/世界疫情最新数据

测试网站&#xff1a; https://regex101.com/r/xHeJSZ/3/ 正则表达式 - (?!), (?:), (?) (?:pattern) 非获取匹配&#xff0c;匹配pattern但不获取匹配结果&#xff0c;不进行存储供以后使用。 这在使用或字符“(|)”来组合一个模式的各个部分是很有用。 例如“industr(?…...

php网站怎么做的/最知名的网站推广公司

Struts2常用标签总结 一 介绍 1&#xff0e;Struts2的作用 Struts2标签库提供了主题、模板支持&#xff0c;极大地简化了视图页面的编写&#xff0c;而且&#xff0c;struts2的主题、模板都提供了很好的扩展性。实现了更好的代码复用。Struts2允许在页面中使用自定义组件&…...

怎么做自助交易网站/站长工具seo综合查询引流

回溯算法1、简介2、基本思想3、基本过程与求解步骤4、适用条件5、经典例题1、简介 \quad \quad回溯算法实际上是基于DFS(深度优先搜索)的一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”…...

wordpress轮播图调用/广州网站优化方式

转自&#xff1a;http://www.cnblogs.com/zhycyq/archive/2012/08/31/2665316.html DbCommand.ExecuteScalar 方法&#xff1a; 执行查询&#xff0c;并返回查询所返回的结果集中第一行的第一列。 所有其他的列和行将被忽略。 语法: public abstract Object ExecuteScalar() 返…...