Qt实现XYModem协议(三)

1 概述

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

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

3 实现

3.2 XModem

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

3.2.1 XModem定义

class XModem : public Modem
{
public:XModem(): id_(0x0){}enum Code {NUL = 0x00,SOH = 0x01,STX = 0x02,EOT = 0x04,ACK = 0x06,NAK = 0x15,CAN = 0x18,C   = 0x43,MAX = 0xff};enum Size {CODE = 1,ID = 2,SIZE1 = 128,SIZE2 = 1024,CRC16 = 2,FRAME_HEAD  = CODE + ID, //1 + 2FRAME_SIZE1 = FRAME_HEAD + SIZE1 + CRC16,// 3 + 128 + 2 = 133FRAME_SIZE2 = FRAME_HEAD + SIZE2 + CRC16, // 3 + 1024 + 2 = 1029DATA_SIZE1 = FRAME_SIZE1 -1,DATA_SIZE2 = FRAME_SIZE2 -1};
protected:virtual uint8_t get_code() = 0;bool tx_send(uint8_t *data, uint32_t size, int max_count = 5);bool tx_eot();bool tx_end();void tx_code(Code code);uint8_t wait_start(int max_count = 5);void tx_cancel();uint8_t not_id(uint8_t id) { return 0xFF - id; }void next_id() { id_ = next_id(id_); } 
private:uint8_t next_id(uint8_t id) { return (id + 1) % 0x100; }void do_send(uint8_t const* data, uint16_t size);void do_eot() { tx_code(EOT); }void do_c() { tx_code(C); }
private:uint8_t id_;uint8_t frame_[FRAME_SIZE2];
};

纯虚接口:

  • get_code 获取操作码Code

函数列表:

  • tx_send 发送数据
  • tx_eot 判断发送是否结束。
  • tx_code 发送操作码
  • wait_start 发送C码等待接收码SOH或STX 码
  • tx_cancel 发送取消帧
  • not_id 返回id的反码
  • next_id 返回下一id

3.2.2 XModem实现

3.2.2.1 tx_send
bool XModem::tx_send(uint8_t *data, uint32_t size, int max_count)
{if(size > SIZE2)return false;do_send(data, size);for(int i = 0; i < max_count; i++){uint8_t code = get_code();if(code == MAX)break;else if(code == NAK)do_send(data, size);else if(code == ACK){next_id();return true;}}return false;
}

函数流程:

  • 发送数据
  • 获取操作码
  • 获得无效操作码,函数返回
  • 获得重传操作码NAK,重传数据
  • 获得确认操作码ACK,说明发送成功,设置下一id
  • 如果一直返回NAK,重复max_count次后函数返回
3.2.2.2 tx_eot
bool XModem::tx_eot()
{do_eot();uint8_t code = get_code();if(code == NAK){std::cout << "need next file" << std::endl;do_eot();if(get_code() == ACK)return true;}else if(code == ACK){return true;}return false;
}

函数流程:

  • 发送EOT码
  • 获取操作码
  • 如果是NAK码,重新发送EOT码
  • 如何是ACK码,成功返回,否则失败返回
3.2.2.3 tx_cancel
void XModem::tx_cancel()
{uint8_t frame[] = { CAN, CAN, CAN, CAN, CAN };write(frame, sizeof(frame));
}

函数流程:

  • 构造包含5个CAN取消码帧
  • 发送取消码帧
3.2.2.4 tx_code
void XModem::tx_code(Code code)
{uint8_t frame[CODE] = { code };write(frame, CODE);
}

函数流程:

  • 构造包含1个操作码帧
  • 发送操作码帧
3.2.2.5 wait_start
uint8_t XModem::wait_start(int max_count)
{for(int i = 0; i < max_count; i++){do_c();uint8_t code = get_code();if(code != MAX)return code;}return MAX;
}

函数流程:

  • 发送C开始码
  • 获取操作码,如果获取到有效操作码,则返回
  • 获取无效操作码重复max_count次上述操作后返回
3.2.2.6 do_send
void XModem::do_send(uint8_t const* data, uint16_t size)
{uint16_t data_size = SIZE2;memset(frame_, 0, sizeof(frame_));frame_[1] = id_;frame_[2] =  not_id(id_);if(size > SIZE1)frame_[0] = STX;else{frame_[0] = SOH;data_size = SIZE1;}memcpy(&frame_[FRAME_HEAD], data, size);memset(&frame_[FRAME_HEAD + size], 0x1A, data_size - size);uint16_t crc = crc16(&frame_[FRAME_HEAD], data_size);frame_[FRAME_HEAD + data_size] = (uint8_t)(crc >> 8);frame_[FRAME_HEAD + data_size + 1] = (uint8_t)(crc >> 0);write(frame_, (data_size == SIZE1 ? FRAME_SIZE1 : FRAME_SIZE2));
}

函数流程:

  • 设置frame头id和not_id
  • 根据大小判断是XModem帧,还是1K-XModem帧
  • 如果数据不满,则填充字节0x1A
  • 计算数据CRC值(包括填充字节)
  • 在帧末尾设置CRC值
  • 发送数据帧
    Qt实现XYModem协议(二)

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

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

相关文章

香港裸机云多IP服务器都有哪些配置?

香港裸机云多IP服务器是一种高效、灵活的云计算服务&#xff0c;为用户提供了多IP地址的配置选项&#xff0c;以满足各种复杂的网络需求。这种服务器在配置上具有丰富的多样性和高度的可定制性&#xff0c;下面我们就来科普一下香港裸机云多IP服务器的主要配置。 首先&#xff…

开源模型应用落地-chatglm3-6b-模型输出违禁词检测(九)

一、前言 受限于模型本身的一些缺陷&#xff0c;任何模型均可能会生成一些不正确的输出。如何通过技术的手段去规避模型潜在的风险&#xff0c;提升推理质量是需要持续探究的过程。 如何利用第三方内容安全审核服务去检测模型输出内容的合规性&#xff0c;请查看&#xff1a;开…

【资源分享】Stata 17免费下载安装

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

LabVIEW仪器信息管理系统

LabVIEW仪器信息管理系统 在计量检测实验室的日常工作中&#xff0c;仪器检定校准是一项基础而重要的任务。随着科技的进步和实验室工作量的增加&#xff0c;传统的人工管理方式已经难以满足现代实验室对效率和准确性的要求。开发一套基于LabVIEW的仪器信息管理系统显得尤为必…

魔方网表ERP mailupdate.jsp 任意文件上传漏洞复现

0x01 产品简介 魔方网表ERP是一款高效、灵活的企业资源规划解决方案,旨在帮助企业实现数智化转型,消除信息孤岛,打造全程一体化的管理体系。魔方网表ERP拥有强大的表单功能和模块化的产品特点,使得企业可以根据自身业务需求,通过简单的拖拽和配置,快速搭建符合自身特点的…

python爬豆瓣top250电影

文章目录 前言分析与实现1.对豆瓣网网站进行Ajax分析2.发送请求3.进一步筛选&#xff08;提取&#xff09; 完整代码 前言 通过这个项目&#xff0c;可以让小白对爬虫有一个初步认识&#xff0c;爬取豆瓣top250是一个初学者学爬虫的必经之路&#xff0c;话不多说&#xff0c;我…

每日算法4/17

1552. 两球之间的磁力 题目 在代号为 C-137 的地球上&#xff0c;Rick 发现如果他将两个球放在他新发明的篮子里&#xff0c;它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子&#xff0c;第 i 个篮子的位置在 position[i] &#xff0c;Morty 想把 m 个球放到这些篮子里&…

【面试经典 150 | 链表】分隔链表

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;模拟 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

Springboot集成JWT token实现权限验证

紧接着上一次的博客&#xff0c;我们现在来给这个项目添加一个jwt的权限验证功能&#xff0c;上一次的博客如下&#xff1a;springboot结合vue实现登录和注册功能-CSDN博客 1.后端 1.1.导入依赖 <dependency><groupId>com.auth0</groupId><artifactId&g…

2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统(一)

01 D题实现效果演示 视频参考微信原文&#xff1a;2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统&#xff08;一&#xff09; 02 D题任务要求 &#xff08;D题原文件参见本文附录&#xff09; 设计并制作一个图中所示的基于互联网的摄像测量系统。图中边长…

【Python】异常处理结构

文章目录 1.python异常2.try_except异常处理结构3.try... 多个except异常处理4.try_except_else异常处理结构5.try_except_finally异常处理结构6.常见报错类型 在运行代码时&#xff0c;总是遇到各种异常&#xff0c;且出现异常时&#xff0c;脚本就会自动的的停止运行&#xf…

就业班 第三阶段(nginx) 2401--4.17 day1 nginx1

负载均衡集群 1、集群是什么&#xff1f; 1 集群&#xff08;cluster&#xff09;技术是一种较新的技术&#xff0c;通过集群技术&#xff0c;可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益&#xff0c;其任务调度则是集群系统中的核心技术。 …

FinalShell 远程连接 Linux(Ubuntu)系统

Linux 系列教程&#xff1a; VMware 安装配置 Ubuntu&#xff08;最新版、超详细&#xff09;FinalShell 远程连接 Linux&#xff08;Ubuntu&#xff09;系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️➡️提出一个问题&#xff1a;为什么使用 FinalShell 连接&#xff0…

初识ansible服务及ansible主机清单配置

目录 1、什么是自动化批量管理 2、自动化工具ansible架构 3、ansible服务专用术语对照表 4、设置主机清单&#xff08;inventory&#xff09; 4.1实验环境准备 4.2配置主机清单 4.2.1分组基本格式 4.2.2指定用户名&#xff0c;密码。端口 4.2.3子组 4.3查看 4.3.1看…

LeetCode———144—— 二叉树的前序遍历

目录 ​编辑 1.题目 2.解答 1.首先计算二叉树的节点个数&#xff1a; 2.以先序遍历&#xff08;Preorder Traversal&#xff09;的方式遍历一个二叉树&#xff0c;并将遍历到的节点的值存储在一个整数数组中 3.最终代码 1.题目 . - 力扣&#xff08;LeetCode&#xff09; 给…

双碳目标下基于“遥感+”集成技术的碳储量、碳排放、碳循环、温室气体等多领域监测与模拟

以全球变暖为主要特征的气候变化已成为全球性环境问题&#xff0c;对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…

[stm32]DMA使用

自动重装和M2M(软件trig)不能一起使用&#xff0c;否则会停不下来 void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size){RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddrAddrA;//外…

爬楼梯(c)

文章目录 描述分析思路关键代码运行结果 描述 给定一个整数数组 cost &#xff0c;其中 cost[i]是从楼梯第i 个台阶向上爬需要支付的费用&#xff0c;下标从0开始。-旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶 要求&#xff1a;请你计算并返回达到楼梯顶部的…

在使用lombok的@Slf4j时,启动项目报错。java:找不到符号

问题背景&#xff1a; 在使用lombok的Slf4j时&#xff0c;启动项目报错。 java&#xff1a;找不到符号符号&#xff1a; 方法info(java.lang.String,java.lang.String)位置&#xff1a; 类型为org.apache.ibatis.logging.Log的变量 log解决方式&#xff1a; 在如图所示位置加…

在线预约家政服务小程序上门服务源码系统 带完整的安装代码包以及搭建教程

随着互联网的快速发展&#xff0c;家政服务行业也逐渐向线上化、智能化转型。为了满足广大用户的需求&#xff0c;罗峰给大家分享一款在线预约家政服务小程序上门服务源码系统。该系统不仅功能完善&#xff0c;而且操作简单&#xff0c;是您打造高效、便捷的家政服务平台的首选…