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

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.lryc.cn/news/329838.html

相关文章:

  • linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)--问题分析
  • 淘宝扭蛋机小程序:趣味购物新体验,惊喜连连等你来
  • linux:生产者消费者模型
  • C++教学——从入门到精通 5.单精度实数float
  • 面向对象设计之单一职责原则
  • 蓝桥杯真题:单词分析
  • Python字符串字母大小写变换,高级Python开发技术
  • CentOS常用功能命令集合
  • 黑马点评项目笔记 II
  • 关于一篇知乎答案的重现
  • 实时数据库测试-汇编小程序
  • HTML5 、CSS3 、ES6 新特性
  • 基于springboot+vue实现的驾校信息管理系统
  • X进制减法(贪心算法C++实现)
  • [Windows]服务注册工具(nssm)
  • Xilinx缓存使用说明和测试
  • LeetCode:2952. 需要添加的硬币的最小数量(贪心 Java)
  • 企业员工在线培训系统功能介绍
  • 服了,一线城市的后端都卷成这样了吗!?
  • Qt扫盲-QAssisant 集成其他qch帮助文档
  • [lesson01]学习C++的意义
  • LabVIEW双通道太阳射电频谱观测系统
  • Trapcode Particular---打造惊艳粒子效果
  • 从0到1利用express搭建后端服务
  • pytest和unittest 如何选择?
  • 《QT实用小工具·四》屏幕拾色器
  • 【Linux C | 多线程编程】线程的连接、分离,资源销毁情况
  • kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(二)
  • 数码管时钟--LABVIEW编程
  • linux安装指定版本docker