当前位置: 首页 > 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.网络请…...

CANN/ops-nn自适应层归一化算子

AdaLayerNorm 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库&#xff0c;实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品√…...

【Linux】权限相关指令

1.将命令翻译后交给核心执行2.将核心执行的结果翻译并返回给我们形象理解shell&#xff1a;假如小y过年回家打算相亲了&#xff0c;打算小y并不擅长与异性交流&#xff0c;这时候就拜托了媒人王姨作为中间人&#xff0c;帮忙小y和异性之前传话。这时候王姨就是“外壳程序”shel…...

DevSquad:基于Docker Compose的一站式开发环境解决方案

1. 项目概述&#xff1a;一个为开发者量身定制的“特种作战小队”如果你是一名开发者&#xff0c;无论是独立作战还是身处团队&#xff0c;一定都经历过这样的场景&#xff1a;为了搭建一个项目&#xff0c;你需要反复安装和配置各种开发工具、运行环境、依赖包。从代码编辑器、…...

VGG改进(24):基于Deformable Convolution网络改进

可变形卷积的核心原理 传统卷积的局限性 标准的二维卷积操作在一个固定的矩形网格上进行采样。假设一个33卷积核,其采样点集合为: {(-1,-1), (-1,0), ..., (1,1)} 每个输出位置的计算涉及对这些固定位置的特征值进行加权求和。这种设计的优点在于结构简单、易于优化,但缺…...

ARMv8地址转换机制与TCR_EL2寄存器详解

1. ARMv8地址转换机制概述在ARMv8架构中&#xff0c;地址转换是连接虚拟地址空间和物理内存的核心机制。这种转换通过多级页表结构实现&#xff0c;允许操作系统和hypervisor灵活地管理内存资源。作为系统程序员&#xff0c;理解这个机制的工作原理对开发高效可靠的系统软件至关…...

ANSYS Workbench网格划分进阶:扫掠、多区与2D网格的实战精解

1. 扫掠网格划分&#xff1a;从原理到实战技巧 第一次用ANSYS Workbench做薄壁结构分析时&#xff0c;我对着那个复杂的几何模型发呆了半小时——到底该选哪种网格划分方法&#xff1f;直到掌握了扫掠网格的精髓&#xff0c;才发现原来处理这类问题可以如此高效。扫掠网格特别适…...

给Windows桌面注入macOS灵魂:鼠标指针美化的艺术之旅

给Windows桌面注入macOS灵魂&#xff1a;鼠标指针美化的艺术之旅 【免费下载链接】macOS-cursors-for-Windows Tested in Windows 10 & 11, 4K (125%, 150%, 200%). With 2 versions, 2 types and 3 different sizes! 项目地址: https://gitcode.com/gh_mirrors/ma/macOS…...

从零到一:树莓派Python实战DHT11温湿度传感器数据采集与解析

1. 硬件准备与环境搭建 第一次玩树莓派配传感器的新手朋友&#xff0c;千万别被那些专业术语吓到。我刚开始接触DHT11温湿度模块时&#xff0c;连杜邦线怎么插都手抖。其实需要的材料特别简单&#xff1a;一块树莓派&#xff08;3B或4B都行&#xff09;、DHT11模块&#xff08;…...

基于copaw-code构建代码语义搜索系统:从原理到实践

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫QSEEKING/copaw-code。这名字乍一看有点摸不着头脑&#xff0c;但如果你对代码搜索、智能辅助编程或者大模型应用开发感兴趣&#xff0c;那这个仓库绝对值得你花时间研究。简单来说&#xff0c;它是一套围…...

蚕健康病害检测数据集(4000张)|YOLO训练数据集 智慧养蚕 病害识别 农业AI 健康监测

蚕健康病害检测数据集&#xff08;4000张&#xff09;&#xff5c;YOLO训练数据集 智慧养蚕 病害识别 农业AI 健康监测 前言 随着智慧农业与人工智能技术的不断发展&#xff0c;传统养蚕产业正逐渐向数字化、智能化方向升级。家蚕作为蚕丝生产的重要经济昆虫&#xff0c;其健康…...