Qt实现XYModem协议(五)

1 概述

  XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K,它以1024字节一块来传输数据。YMODEM也是一种XMODEM的实现。它包括XMODEM-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。

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

3 实现

3.4 XYModemSendFile

该模块实现XYModem协议发送文件。

流程图:
流程图

3.4.1 XYModemSendFile定义

class QSerialPort;
class XYModemSendFile : public QObject, public YModem
{Q_OBJECT
public:explicit XYModemSendFile(QSerialPort *serial, QObject *parent = nullptr);public slots:void startYModem(QString const& fileName);void startXModem(QString const& fileName);void stop() { { doSignal(); }}void cancel() { tx_cancle(); }
signals:void gotFileSize(quint64 filesize);void progressInfo(quint32 blockNumber, quint64 bytesOfSend);void error(QString const& e);void finished();protected:uint32_t write(uint8_t const *data, uint32_t size) override;uint32_t read(uint8_t *data, uint32_t size) override;uint8_t get_code(bool isWait = true) override;
private:bool singled() { return signal_; }void doSignal() { signal_ = true; };void doError(QString const& text);
private:QSerialPort* serial_;volatile bool signal_;
};

公共接口:

  • startYModem 开始YModem协议发送文件
  • startXModem 开始XModem协议发送文件
  • stop 停止发送
  • cancel 取消发送

信号:

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

重载接口:

  • write 向串口写数据
  • read 从串口读取数据
  • get_code 读取操作码

3.4.2 XYModemSendFile实现

3.4.2.1 startYModem
void XYModemSendFile::startYModem(QString const& fileName)
{QFileInfo fileInfo(fileName);uint64_t fileSize = fileInfo.size();std::string filename = fileInfo.fileName().toStdString();std::string filesize = QString::number(fileSize).toStdString();if(filename.size() + filesize.size() + 2 > SIZE1){doError("Filename too long!");return;}//Get Start flagif(get_code() != C){doError("Can not get  C!");return;}//SOH first blockemit gotFileSize(fileSize);if(!tx_start(filename, filesize)){doError("Can not get  ACK and C!");return;}//Send data of fileQFile file(fileName);if(!file.open(QIODevice::ReadOnly)){doError(QString("%1 cannot be opened!").arg(fileName));return;}uint8_t data[SIZE2];quint64 bytesOfSend = 0;quint32 block = 0;bool is_end = false;while(!singled()){quint64 size = file.read((char *)data, sizeof(data));if(size == 0){is_end = true;break;}if(tx_send(data, size)){block++;bytesOfSend += size;emit progressInfo(block, bytesOfSend);}else{emit error("send is error");break;}}//Send endif(is_end){if(tx_eot()){if(tx_end()){//std::cout << "end is ok" << std::endl;}}}emit finished();serial_->moveToThread(QApplication::instance()->thread());
}

函数流程:

  • 获取文件名和文件大小字符串
  • 如果文件名和文件大小字符串大小大于Size1(128)则返回文件名称太长错误返回
  • 获取操作码
  • 获得非C操作码,失败返回
  • 发送文件大小信号gotFileSize
  • 发送开始包(包括文件名称和文件大小。YModem协议发送该包,XModem协议不发送该包)
  • 打开文件,如果失败则返回
  • 读取文件内容
  • 发送文件内容
  • 发送成功发送,发送进度信号progressInfo
  • 发送失败,则发送错误信号并返回
  • 重复上述4步,直到文件发送完毕或停止
  • 如果文件发送完毕包(tx_eot),发送文件结束标志
  • 发送通信结束包(tx_end),结束通信。(这里只发送一个文件所以发送tx_end, 如果是多个文件需要发送tx_start开始新文件发送)
  • 发送传输结束信号finished
3.4.2.2 startXModem
void XYModemSendFile::startXModem(QString const& fileName)
{QFileInfo fileInfo(fileName);uint64_t fileSize = fileInfo.size();//Get Start flagif(get_code() != C){doError("Can not get  C!");return;}//SOH first blockemit gotFileSize(fileSize);//Send data of fileQFile file(fileName);if(!file.open(QIODevice::ReadOnly)){doError(QString("%1 cannot be opened!").arg(fileName));return;}uint8_t data[SIZE2];quint64 bytesOfSend = 0;quint32 block = 0;bool is_end = false;next_id();while(!singled()){quint64 size = file.read((char *)data, sizeof(data));if(size == 0){is_end = true;break;}if(tx_send(data, size)){block++;bytesOfSend += size;emit progressInfo(block, bytesOfSend);}else{emit error("send is error");break;}}//Send endif(is_end){if(tx_eot()){//std::cout << "end is ok" << std::endl;}}emit finished();serial_->moveToThread(QApplication::instance()->thread());
}

函数流程:

  • 获取文件大小
  • 获取操作码
  • 如果不是C码,失败返回
  • 发送文件大小信号gotFileSize
  • 打开文件,如果失败则返回
  • 发送文件内容
  • 发送成功发送,发送进度信号progressInfo
  • 发送失败,则发送错误信号并返回
  • 重复上述4步,直到文件发送完毕或停止
  • 如果文件发送完毕包(tx_eot),发送文件结束标志
  • 发送传输结束信号finished
3.4.2.3 write/read
uint32_t XYModemSendFile::write(uint8_t const *data, uint32_t size)
{return serial_->write((const char *)data, size);
}
uint32_t XYModemSendFile::read(uint8_t *data, uint32_t size)
{return serial_->read((char *)data, size);
}

函数说明:

  • 直接调用串口读写接口实现读写接口。
3.4.2.4 get_code
uint8_t XYModemSendFile::get_code(bool isWait)
{while(!singled()){if(serial_->waitForReadyRead(10)){uint8_t data[1] = { 0 };read(data, sizeof(data));return data[0];}if(!isWait)break;}return MAX;
}

函数流程:

  • 等待串口输入
  • 如果有输入则读取一字节做为code码并返回.
  • 如果一直没有输入直到调用stop后返回无效码MAX.
3.4.2.5 doError
void XYModemSendFile::doError(QString const& text)
{emit error(text);serial_->moveToThread(QApplication::instance()->thread());emit finished();
}

函数流程:

  • 发送错误信号
  • 发送结束信号

Qt实现XYModem协议(四) Qt实现XYModem协议(六)

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

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

相关文章

35K的鸿蒙音视频开发岗位面经分享~

一个月前&#xff0c;阿里云在官网音视频终端 SDK 栏目发布适配 HarmonyOS NEXT 的操作文档和 SDK&#xff0c;官宣 MediaBox 音视频终端 SDK 全面适配 HarmonyOS NEXT。 此外&#xff0c;阿里云播放器 SDK 也在华为开发者联盟官网鸿蒙生态伙伴 SDK 专区同步上线&#xff0c;面…

面向对象设计与分析40讲(25)中介模式、代理模式、门面模式、桥接模式、适配器模式

文章目录 门面模式代理模式中介模式 之所以把这几个模式放到一起写&#xff0c;是因为它们的界限比较模糊&#xff0c;结构上没有明显的差别&#xff0c;差别只是语义上。 这几种模式在结构上都类似&#xff1a; 代理将原本A–>C的直接调用变成&#xff1a; A–>B–>…

负采样重要吗?它的理论与应用综述

Does Negative Sampling Matter? A Review with Insights into its Theory and Applications 负采样重要吗&#xff1f;它的理论与应用综述 Does Negative Sampling Matter? A Review with Insights into its Theory and Applications Zhen Yang, Ming Ding, Tinglin Huang,…

基于python实现web漏洞挖掘技术的研究(django)

基于python实现web漏洞挖掘技术的研究(django) 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;网络爬虫&#xff0c;SQL注入&#xff0c;XSS漏洞工具&#xff1a;pycharm、Navicat、Maven 系统的实现与漏洞挖掘 系统的首页面 此次的系统首页面是登录的页…

BootstrapAdmin Net7:基于RBAC的后台管理框架,实现精细化权限管理与多站点单点登录

BootstrapAdmin Net7&#xff1a;基于RBAC的后台管理框架,实现精细化权限管理与多站点单点登录 摘要 随着企业信息化建设的不断深入&#xff0c;后台管理系统在企业运营中扮演着越来越重要的角色。本文介绍了一款基于RBAC&#xff08;Role-Based Access Control&#xff09;的…

291个地级市资源错配指数、劳动和资本相对扭曲指数(2006-2021年)

01、数据介绍 资源错配指数&#xff08;Misallocation Index&#xff09;是一个用于衡量资源配置效率的指标&#xff0c;它衡量的是生产要素的配置是否合理&#xff0c;是否达到了最优的状态。资源错配指数越高&#xff0c;资源的利用效率越低。资源错配指数主要用于衡量各种生…

企业实施定制鞋厂ERP软件需要注意哪些问题?

企业实施定制鞋厂ERP软件是个复杂的管理系统工程&#xff0c;为了成功地为企业定制实施ERP软件&#xff0c;需要注意和解决几个关键的问题&#xff1a; . 确立ERP系统实施和定制的决策者&#xff1b;. 做好前期咨询与调研工作&#xff1b;. 做好系统产品或项目迭代规划&#x…

Uds诊断协议的请求和响应的寻址

一根总线上挂载着很多ECU&#xff0c;那么基于CAN协议UDS的诊断请求报文&#xff0c;诊断仪是如何发给ECU的&#xff1f;如何精准的找到想要诊断的那个ECU&#xff1f;ECU又是如何将诊断响应的报文返回给诊断仪&#xff1f; 在UDS协议中&#xff0c;规定了诊断请求和响应报文发…

记录:阿里云服务器网站搭建(3)

Docker安装配置Tomcat 拉取镜像 docker pull tomcat:8启动一个tomcat容器用于拷贝配置文件 docker run -d -p 8080:8080 --name tomcat tomcat:8拷贝容器内tomcat配置文件和日志到本地准备映射 docker cp tomcat:/usr/local/tomcat/conf /mydata/tomcat/confdocker cp tomca…

WebStorm2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 WebStorm是一款由JetBrains公司开发的强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于前端开发。它提供了丰富的功能和工具&#xff0c;包括代码编辑器、调试器、版本控制集成等&#xff0c;使开发人员能够更…

LocalAi,Ollama+AnythingLLM搭建部署本地大模型AI知识库,汉化版本

AnythingLLM 是一个全栈应用程序&#xff0c;您可以使用商业现成的 LLM 或流行的开源 LLM 和 vectorDB 解决方案来构建私有 ChatGPT&#xff0c;无需任何妥协&#xff0c;您可以在本地运行&#xff0c;也可以远程托管并能够智能聊天以及您提供的任何文件。 AnythingLLM 将您的文…

人工智能大模型培训老师叶梓 探索知识库问答中的查询图生成:处理多跳复杂问题的新方法

在人工智能领域&#xff0c;基于知识库的问答&#xff08;KBQA&#xff09;技术正变得越来越重要。它使得机器能够理解自然语言问题&#xff0c;并从结构化的知识库中检索答案。然而&#xff0c;面对多跳复杂问题&#xff0c;传统的KBQA方法往往力不从心。近期&#xff0c;研究…

芒果超媒的“乘风破浪”,差了一点市场海浪的反馈

4月21日晚间&#xff0c;芒果超媒发布了2023年度&2024一季度报告。 芒果超媒2023年实现营业收入146.28亿元&#xff0c;同比增长4.66%&#xff1b;净利润35.56亿元&#xff0c;同比增长90.73%&#xff1b;基本每股收益1.90元。公司拟每10股派发现金红利1.8元。2024年第一季…

数据可视化(八):Pandas时间序列——动态绘图,重采样,自相关图,偏相关图等高级操作

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

腾讯云服务器价格明细表2024年最新(CPU内存/带宽/磁盘)

腾讯云服务器价格明细表2024年最新&#xff08;CPU内存/带宽/磁盘&#xff09;腾讯云服务器租用优惠价格表&#xff1a;轻量应用服务器2核2G3M价格61元一年&#xff0c;2核2G4M价格99元一年、135元15个月、540元三年&#xff0c;2核4G5M带宽165元一年、252元15个月、756元3年&a…

2024 应届校招经验分享(非互联网篇)

&#x1f4e2;&#x1f4e2;&#x1f4e2; 2024年应届毕业生&#xff0c;浙江大学计算机研究生。自23年秋招开始至今&#xff0c;博主先后拿到了互联网行业、机械制造行业、国企央企、高校体制等多家企业和单位的数十个Offer&#xff0c;了解多行业中的计算机求职方向&#xff…

Java转go,我用了12小时,10小时在解决环境问题

Part1 问题背景 作为一个资深的Java开发者&#xff0c;我深知面向对象的高级语言&#xff0c;语法是不用学的。需要的时候搜索就可以了&#xff0c;甚至可以用ChatGPT来写。 之前我做一个安全多因素校验服务。因为是临时服务&#xff0c;扩展性上基本没有要求&#xff0c;为了快…

Vulnhub靶机 DC-6 打靶实战 详细渗透测试过程

Vulnhub靶机 DC-6 详细渗透流程 打靶实战 目录 Vulnhub靶机 DC-6 详细渗透流程 打靶实战一、将靶机导入到虚拟机当中二、渗透测试主机发现端口扫描信息探测web渗透目录爆破爆破后台密码反弹shell搜集有价值信息SSH远程登录提权反弹jens用户权限的shell 提权利用 一、将靶机导入…

stable diffusion本地部署@win10

一键无脑安装stable-diffusion-webui stable diffusion是当前非常出色的文生图模型&#xff0c;要优于以前gan文生图模型。现在有了stable-diffusion-webui软件&#xff0c;可以一键安装&#xff0c;大大简化了操作难度。本文档就是stable-diffusion-webui在windows 10上的安装…

誉天教育新班上新,免费试听!

数通HCIP 周末班 2024/4/20 阮老师 RHCE 周末班 2024/4/20 徐老师 云计算直通车 周末班 2024/4/20 田老师 欧拉HCIE 周末班 2024/4/20 晏老师 存储HCIE 晚班 2024/4/22 高老师 云服务直通车 周末班 2024/4/27 高老师 安全HCIE 晚班 2024/5/6 胡老…