Qt实现Kermit协议(一)

1 概述

Kermit文件运输协议提供了一条从大型计算机下载文件到微机的途径。它已被用于进行公用数据传输。
其特性如下:

  • Kermit文件运输协议是一个半双工的通信协议。
  • 它支持7位ASCII字符。
  • 数据以可多达96字节长度的可变长度的分组形式传输。
  • 对每个被传送分组需要一个确认。
  • Kermit文件运输协议在每次会话中可以传送多个文件。

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

2 概要设计

2.1 类图

类图

类型说明:

  • Kermit 实现了Kermit协议。
  • KermitSendFile 实现Kermit协议发送文件。
  • KermitRecvFile 实现Kermit协议接收文件。
  • KermitFileSender 实现在线程中异步发送文件。
  • KermitFileRecver 实现在线程中异步接收文件。

2.3 模块

整个代码分为5个模块.

2.3.1 Kermit

该模块定义和实现了Kermit类型。
Kermit类型是纯虚类型,其派生类需要实现下面三个虚函数:

  • write 向串口写数据
  • read 从串口读数据
  • getc 从串口读取一个字符

文件列表:

  • kermit.h
  • kermit.cpp

2.3.2 KermitSendFile

该模块定义和实现了KermitSendFile类型。
KermitSendFile从Kermit派生,实现类三个读写接口:

  • write
  • read
  • getc

重新实现如下接口:

  • on_ack
  • on_nack
  • on_error

文件列表:

  • kermitsendfile.h
  • kermitsendfile.cpp

2.3.3 KermitRecvFile

该模块定义和实现了KermitRecvFile类型。
KermitRecvFile从Kermit派生,实现类三个读写接口:

  • write
  • read
  • getc

重新实现如下接口:

  • on_init
  • on_data
  • on_break

文件列表:

  • kermitrecvfile.h
  • kermitrecvfile.cpp

2.3.4 KermitFileSender

该模块定义和实现了KermitFileSender类型。
KermitSendFile发送文件是同步操作,KermitFileSender将发送文件操作放入线程中实现异步调用。

文件列表:

  • kermitfilesender.h
  • kermitfilesender.cpp

2.3.5 KermitFileRecver

该模块定义和实现了KermitFileRecver类型。
KermitRecvFile接收文件是同步操作,KermitFileRecver将接收文件操作放入线程中实现异步调用。

文件列表:

  • kermitfilerecver.h
  • kermitfilerecver.cpp

使用

发送文件

void SerialPortWidget::sendFileByKermit(QString const& fileName)
{QObject::disconnect(serial, SIGNAL(readyRead()), this, SLOT(onData()));FileProgressDialog dialog(this);KermitFileSender sender(serial);connect(&sender, &KermitFileSender::gotFileSize, &dialog, &FileProgressDialog::setFileSize);connect(&sender, &KermitFileSender::progressInfo, &dialog, &FileProgressDialog::setProgressInfo);connect(&sender, &KermitFileSender::finished, &dialog, &FileProgressDialog::finished);connect(&sender, &KermitFileSender::error, &dialog, &FileProgressDialog::error);dialog.setTitle(tr("Kermit Send"));dialog.setProtocol("Kermit");dialog.setFilename(QFileInfo(fileName).fileName());dialog.setModal(true);dialog.setVisible(true);sender.start(fileName);while(!dialog.isFinished()){if(dialog.isCancel()){sender.stop();while(!dialog.isFinished())QApplication::processEvents();sender.cancel();}QApplication::processEvents();}connect(serial, SIGNAL(readyRead()), this, SLOT(onData()));
}

接收文件

void SerialPortWidget::recvFileByKermit(QString const& fileName)
{QObject::disconnect(serial, SIGNAL(readyRead()), this, SLOT(onData()));FileProgressDialog dialog(this);KermitFileRecver recver(serial);connect(&recver, &KermitFileRecver::gotFileSize, &dialog, &FileProgressDialog::setFileSize);connect(&recver, &KermitFileRecver::progressInfo, &dialog, &FileProgressDialog::setProgressInfo);connect(&recver, &KermitFileRecver::finished, &dialog, &FileProgressDialog::finished);connect(&recver, &KermitFileRecver::error, &dialog, &FileProgressDialog::error);dialog.setTitle(tr("Kermit Recv"));dialog.setProtocol("Kermit");dialog.setFilename(QFileInfo(fileName).fileName());dialog.setModal(true);dialog.setVisible(true);recver.start(fileName);while(!dialog.isFinished()){if(dialog.isCancel()){recver.stop();while(!dialog.isFinished())QApplication::processEvents();recver.cancel();}QApplication::processEvents();}connect(serial, SIGNAL(readyRead()), this, SLOT(onData()));
}

Qt实现Kermit协议(二)

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

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

相关文章

LeetCode刷题笔记之hot 100(二)

1. 322【零钱兑换】- 动态规划 题目: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回…

关于视场角,你需要知道这些!

视场角在光学工程中又称视场,视场角的大小决定了光学仪器的视野范围。视场角又可用FOV(Field of view)表示,其与焦距的关系如下:像高 EFL*tan (半FOV);EFL为焦距;FOV为视场角。即以入瞳位置为顶…

一个包一条命令,我实现了对整个前端项目代码的校验

在现代前端开发中,代码校验与风格统一不仅是良好编程习惯的体现,更是提升项目质量、保障代码可维护性与减少潜在bug的关键环节。然而,面对诸如ESLint、Commitlint、Stylelint等多样化的校验工具,以及针对React、Vue等不同前端框架…

笔记本电脑上部署LLaMA-2中文模型

尝试在macbook上部署LLaMA-2的中文模型的详细过程。 (1)环境准备 MacBook Pro(M2 Max/32G); VMware Fusion Player 版本 13.5.1 (23298085); Ubuntu 22.04.2 LTS; 给linux虚拟机分配8*core CPU 16G RAM。 我这里用的是16bit的量化模型,…

java线程(一)--进程,多线程,synchronized和lock锁,JUC,JUnit

Java线程入门 单核CPU和多核CPU的理解 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。例如:虽然有多车道,但是收费站只有一个工作人员在收费,只有收了费才能通过&#xf…

LeetCode226:反转二叉树

题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 解题思想 使用前序遍历和后序遍历比较方便 代码 class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) return root;swap(root->left, root…

nginx 常用功能

添加白名单配置 if ($clientRealIp ~ "192.157.34.245|17.213.126.21") {rewrite ^.*$ /403.html last;break; } 添加站点配置信息 nginx.conf 文件最后一行添加 并新建vhost 目录 include /usr/local/nginx/conf/vhost/*.conf;include vhost/*.conf;

什么是ISP住宅IP?相比于普通IP它的优势是什么?

什么是ISP住宅IP? ISP住宅IP是指由互联网服务提供商(ISP)分配给住宅用户的IP地址。它是用户在家庭网络环境中连接互联网的标识符,通常用于上网浏览、数据传输等活动。ISP住宅IP可以是动态分配的,即每次连接时都可能会…

【DevOps工具篇】 OpenLDAP的LDAP服务器(slapd)是什么?

目录 OpenLAP的LDAP服务器(slapd)是什么基本功能安全性管理性可靠性和可扩展性调优OpenLDAP的服务器基本功能简单身份验证和SASL身份验证LDAP模式OpenLDAP服务器管理LDAP服务器配置LDAP数据备份和还原slapcatslapaddslapindex

C++类复习

C类 1. 类内成员函数隐式声明为inline class Str {int x;int y 3; public:inline void fun(){std::cout<<"pf,yes!"<<std::endl;} };这段代码不会报错&#xff0c;但是类内的成员函数隐式声明为inline函数&#xff0c;不需要单独写在前面。因此将成员…

BOM系统:贯穿制造全程的管理利器

在制造行业中&#xff0c;BOM系统的应用已经成为提高生产效率、降低成本和确保产品质量的关键因素。BOM系统作为产品结构和物料清单的管理工具&#xff0c;为制造企业提供了全面的控制和协同能力。 1.产品设计与开发&#xff1a;在产品设计阶段&#xff0c;BOM系统为工程师提供…

基于自动编码器的预训练模型方法模型预训练方法RetroMAE和RetroMAE-2

文章目录 RetroMAERetroMAE详情编码解码增强解码 RetroMAE-2RetroMAE-2详情编码[CLS]解码OT解码和训练目标向量表征 总结参考资料 RetroMAE RetroMAE 出自论文《RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder》&#xff0c;是一种针对于…

ES-7.12-官方文档阅读-ILM-Automate rollover

教程&#xff1a;使用ILM自动化滚动创建index 当你持续将带有时间戳的文档index到Elasticsearch当中时&#xff0c;通常会使用数据流&#xff08;data streams&#xff09;以便可以定义滚到到新索引。这是你能够实施一个hot-warm-cold架构来满足你的性能要强&#xff0c;控制随…

OpenHarmony实战:RK3568 开发板镜像烧录指南

前言 烧录开发板是每个开发者的必修课&#xff0c;每次对系统的修改务必进行烧录测试&#xff0c;确保修改正确和不会引入新问题。 本文基于 Windows10&#xff0c;以 RK3568 开发板为例&#xff0c;指导如何烧录 OpenHarmony 镜像&#xff0c;镜像也叫固件。Hihoop&#xff…

Oracle利用BBED恢复崩溃实例(ORA-01092,ORA-00704,ORA-01578)

BBED修复数据损坏引起的数据库崩溃&#xff08;ORA-01092,ORA-00704,ORA-01578&#xff09;(2021年某苏州国企的案例&#xff09; 1.Symptom 用户一个边缘系统出现数据文件损坏&#xff0c;且没有备份&#xff0c;数据库无法启动 报错如下&#xff0c;发现是oracle bootstra…

【Vue3进阶】- 第2学堂小商城实战课程前言

该教程为进阶教程&#xff0c;如果你还不了解Vue3的基础知识&#xff0c;可以先前往Vue3基础教程&#xff0c;从入门到实战。 学习时遇到的任何疑问都欢迎在相应课文页面下方的问答区进行提问哦 我能学到什么&#xff1f; 编程写法千千万&#xff0c;实现需求是第一。 教程中…

Docker容器、Serverless与微服务:腾讯云云原生架构技术实践案例集解析

前言 随着云原生技术的飞速发展&#xff0c;容器化和函数计算正成为企业和开发者关注的焦点。在这一潮流中&#xff0c;腾讯云凭借其卓越的技术实力和深厚的行业积累&#xff0c;发布了《2023腾讯云容器和函数计算技术实践精选集》&#xff0c;为我们提供了一份深入探索云原生…

C# 异步问答集

问&#xff1a;调用方法(callingmethod):该方法调用异步方法&#xff0c;然后在异步方法执行其任务的时候继续执行(可能在相同的线程上&#xff0c;也可能在不同的线程上)。为什么会在不同的线程上&#xff1f; 答&#xff1a;在调用异步方法后&#xff0c;调用方法不会立即…

CAS(Compare And Swap)

目录 CAS概念 乐观锁与悲观锁 ABA问题 Unsafe类 ​编辑 原子类 基本类型原子类 原子引用类 原子数组 原子更新器类 原子累加器 CAS概念 CAS是Compare And Swap的缩写&#xff0c;中文翻译成&#xff1a;比较并交换&#xff0c;实现无锁并发时常用到的一种技术。它一…

3.Labview字符串与路径精讲(下) — 字符串及路径的用法汇总

本章讲解labview中的字符串和路径具体实践用例&#xff0c;从前面板字符串属性到后面板字符串函数应用做出详细概述&#xff0c;通过本文的学习希望大家了解到字符串及路径在labview编程中的重要地位。 本系列文章为labview 从基础到强化到精通的学习文章&#xff0c;大家可以随…