Qt实现XYModem协议(四)

1 概述

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

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

3 实现

3.3 YModem

该模块定义和实现了YModem协议。

3.3.1 YModem定义

class YModem : public XModem
{
public:YModem();
protected:bool tx_start(std::string const& filename, std::string const& filesize);bool tx_end();
private:void do_start(std::string const& filename, std::string const& filesize);;void do_end();
};

函数列表:

  • tx_start 发送开始帧,并确认状态
  • tx_end 发送结束帧,并确认状态
  • do_start 发送开始帧
  • do_end 发送结束帧

3.3.2 YModem实现

3.3.2.1 tx_start
bool YModem::tx_start(std::string const& filename, std::string const& filesize)
{do_start(filename, filesize);uint8_t code = get_code();if(code != ACK)return false;code = get_code();if(code != C)return false;return true;
}

函数流程:

  • 发送开始帧
  • 获取操作码
  • 获得非ACK操作码,失败返回
  • 获取操作码
  • 获得确认操作码C,成功返回,否则失败返回
3.3.2.2 tx_end
bool YModem::tx_end()
{do_end();if(get_code() == ACK)return true;return false;
}

函数流程:

  • 发送结束帧
  • 获取操作码
  • 如果是ACK码,成功返回,否则失败返回
3.3.2.3 do_start
void YModem::do_start(std::string const& filename, std::string const& filesize)
{uint8_t frame[FRAME_SIZE1] = { SOH, 0, not_id(0) };memcpy(&frame[FRAME_HEAD], filename.c_str(), filename.size());memcpy(&frame[FRAME_HEAD + filename.size() + 1], filesize.c_str(), filesize.size());uint16_t crc = crc16(frame + FRAME_HEAD, SIZE1);frame[FRAME_HEAD + SIZE1] = (uint8_t)(crc >> 8);frame[FRAME_HEAD + SIZE1 + 1] = (uint8_t)(crc >> 0);write(frame, sizeof(frame));next_id();
}

函数流程:

  • 构造开始帧头
  • 设置文件名称和文件大小
  • 设置CRC值
  • 发送开始帧
3.3.2.4 do_end
void YModem::do_end()
{uint8_t frame[FRAME_SIZE1] = { SOH, 0, not_id(0) };uint16_t crc = crc16(frame + FRAME_HEAD, SIZE1);frame[FRAME_HEAD + SIZE1] = (uint8_t)(crc << 8);frame[FRAME_HEAD + SIZE1 + 1] = (uint8_t)(crc << 0);write(frame, FRAME_SIZE1);
}

函数流程:

  • 构造结束帧
  • 发送结束帧
    Qt实现XYModem协议(三) Qt实现XYModem协议(五)

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

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

相关文章

Leetcode 4.21

1.罗马数字转整数 用unordered_map去存罗马数字对应的数值&#xff0c;分情况讨论&#xff0c;把所有情况都列出来即可 class Solution { public:unordered_map<char, int> mp {{I, 1},{V, 5},{X, 10},{L, 50},{C, 100},{D, 500},{M, 1000}};int romanToInt(string s)…

Kubernetes TDengine 系列|安装 TDengine 的 Grafana 插件|Grafana监控TDengine数据

为了让Grafana 能够监控到TDengine 数据&#xff0c;快速集成搭建数据监测报警系统&#xff0c;所以直接安装TDengine 插件。 目录 一、安装 TDengine 的 Grafana 插件1、下载TDengine grafana插件2、解压到指定目录3、配置未签名插件 二、配置数据源&#xff0c;简单查询TDen…

【已解决】VMware虚拟机中出现无法将“iso文件”当做CD-ROM映像进行连接:找不到该文件的错误

报错 在VMware上运行虚拟机时报错&#xff1a;VMware虚拟机中出现无法将“iso文件”当做CD-ROM映像进行连接&#xff1a;找不到该文件的错误 原因分析 找不到这个iso文件了&#xff0c;检查文件位置 解决方案 找到iso文件&#xff0c;然后在VM中编辑虚拟机中这个文件的位置…

算法:堆(优先队列)

堆&#xff08;优先队列&#xff09;分为最大堆和最小堆。 python实现 class HEAPQ:# 最小堆def __init__(self, l):self.l lself.build()def build(self):n len(self.l)end n // 2for i in range(end, -1, -1):self.update(i)def update(self, i):l self.ln len(l)idx …

前端点击地图上的位置获取当前经纬度

地图封装组件 <template><div id"container"></div> </template> <script>import AMapLoader from amap/amap-jsapi-loader;export default {name: "Mapview",props:{mapinfo:{type:Object,default:function(){return {}}}…

AI-数学-高中-45函数单调性与导数

原作者视频&#xff1a;【导数】【一数辞典】5函数单调性与导数&#xff08;重要&#xff09;_哔哩哔哩_bilibili 导数最重要作用&#xff1a;判断函数单调性。 示例&#xff1a;

新风口下的必应bing国内广告投放该怎么做?

必应Bing作为全球搜索引擎市场的重要参与者&#xff0c;正逐渐显现出其在国内市场的独特价值和潜力。随着互联网生态的多元化发展&#xff0c;必应Bing凭借其高质量用户群和精准投放能力&#xff0c;成为了企业寻求新增长点的新风口。 一、洞察先机&#xff0c;精准定位市场 …

运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

简述 一个人的游戏叫孤独&#xff0c;一群人的游戏才是乐趣&#xff0c;随着电竞产业在国内的快速发展&#xff0c;游戏陪练行业也迅速成长&#xff0c;现在很多游戏玩家为了追求更高质量的游戏体验感&#xff0c;往往会在玩游戏的过程中找陪练&#xff0c;通过陪玩系统进行预…

python绘制等高线图

在Python中&#xff0c;可以使用matplotlib和numpy库来绘制等高线图&#xff08;contour plot&#xff09;。等高线图通常用于显示三维数据的二维投影&#xff0c;其中颜色或线条的密度表示第三维的值。 以下是一个简单的示例&#xff0c;说明如何使用这些库来创建等高线图&am…

欧姆龙FZ5-L355维修工业视觉系统主机电脑主板Omron FZ5 L355深圳捷达工控维修

工业计算机&#xff1a;坚固耐用&#xff0c;为机器视觉做好准备 由于其重要性和及时性&#xff0c;质量控制已被确定为生产的主要瓶颈之一。借助机器视觉&#xff0c;物联网设备和机器视觉系统协同工作&#xff0c;以超人的准确性和速度实现质量控制流程自动化。然而&#xf…

Recat学习

1&#xff0c;创建 项目搭建 npm config set registry http://registry.npm.taobao.org/ // 安装yarn npm install -g yarn // 安装cnpm npm install -g cnpm -registryhttps://registry.npm.taobao.org //设置国内源 yarn config set registry https://registry.npm.taobao.o…

租用新加坡服务器部署wordpress如何加速?

要加速在新加坡服务器上部署WordPress&#xff0c;可以采取以下一些措施&#xff1a; 1. 选择性能优越的主机提供商&#xff1a;选择具有优质硬件、高性能网络和优化服务器配置的主机提供商。确保服务器的硬件资源充足&#xff0c;网络连接稳定&#xff0c;以提高WordPress网站…

常用的JDK9-JDK17的一些新增语法特性

目录 1.前言2.一些新增的特性2.1 yield关键字2.2 var关键字2.3 空指针异常2.4 密封类2.5 接口中的私有方法2.6 instanceof2.7 其他 1.前言 从springboot3.0开始&#xff0c;已经不⽀持JDK8了。参考资料 &#xff1a;Spring官方博客。从3.0开始&#xff0c;转变为JDK17。 官方…

Node+Vue3+mysql+ant design实现前后端分离——表格的添加、修改和删除

在上一篇文章中,我们分享了如何运用NodeJS、Vue、MySQL以及其他技术来实现后台管理系统中的表格查询功能。今天,我们将继续探讨另外三个重要的功能实现原则。这些原则在构建后台管理系统时至关重要,同时还有导入和导出这两种功能也必不可少。关于导入和导出功能,我们会在下…

2024.4月最新的高额度Hostinger优惠券、优惠代码、优惠链接

优惠链接&#xff1a;https://hostinger.com?REFERRALCODE1RAY132 以上优惠链接最低可获取30%折扣&#xff0c;以Cloud Startup版本为例&#xff0c;四年期直接购买价格为480 &#xff0c;使用以上优惠链接购买价为 380 &#xff0c;使用以上优惠链接购买价为380 &#xff0c…

CUDA的开发框架

CUDA的开发框架主要提供了一系列工具和库&#xff0c;使得开发者可以充分利用NVIDIA GPU进行高效的并行计算。以下是CUDA开发框架的一些关键组成部分。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.CUDA核心库&#xff1a;这些是构…

C++设计模式:中介者模式(十五)

1、定义与动机 定义&#xff1a;用一个中介对象来封装&#xff08;封装变化&#xff09;一系列的对象交互。中介者使各个对象不需要显示的相互引用&#xff08;编译时依赖 -> 运行时依赖&#xff09;&#xff0c;从而使其耦合松散&#xff08;管理变化&#xff09;&#xff…

vue3+node.js+mysql+ant design实现表格的查询功能

今日主要分享如何运用vue、nodejs、mysql及ant design构建表格数据查询功能&#xff0c;这也是众多项目开发者关注的问题。最关键在于前端与后端的协作&#xff0c;后端数据则通过nodejs编写。尽管涉及多项技术&#xff0c;看似复杂&#xff0c;但实际操作却并非困难。当然&…

企业如何建立网络事件应急响应团队?

企业如何建立网络事件应急响应团队&#xff1f; 一、应急响应中每一秒都很重要二、选择外包服务还是建立自己的网络安全应急响应团队&#xff1f;三、您的应急响应团队需要谁&#xff1f;1. 应急响应小组2. 技术支持和监控团队 四、应急响应小组1. 安全分析工程师 – 具有网络、…

Selenium 使用指南

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Selenium是网页应用中最流行的自动化测试工具&#xff0c;可以用…