Qt实现XYModem协议(四)

embedded/2024/12/23 6:40:18/

1 概述

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

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

3 实现

YModem_5">3.3 YModem

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

YModem_7">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 发送结束帧

YModem_27">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.ppmy.cn/embedded/16258.html

相关文章

大小写不规范引起的LVS问题

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章链接: LVS常见问题解析 综合网表不规范,大小写混用常导致LVS问题,比如两个端口clk和CLK只有大小写区别,PR工具是可以识别为两个端口的,只不过Calibre LVS默认不区分大小写,会报错。 …

初识reactor响应式编程

起源 Reactor响应式编程起源于数据流和变化的传播概念&#xff0c;其核心概念是由底层的执行模型通过数据流自动传播变化。这种编程范式最早由.NET平台上的Reactive Extensions (Rx)库实现&#xff0c;后来迁移到Java平台后&#xff0c;产生了著名的RxJava库&#xff0c;并衍生…

3. 4XX (Client Error 客户端错误状态码)

4XX 的响应结果表明客户端是发生错误的原因所在。 &#xff08;1&#xff09;400 Bad Request 该状态码表示请求报文中存在语法错误。当错误发生时&#xff0c;需修改请求的内容后再次发送请求。另外&#xff0c;浏览器会像 200 OK 一样对待该状态码。 &#xff08;2&#xff0…

选购AI智能电话机器人需要注意哪些事项

近年来&#xff0c;随着移动互联网、大数据、超级计算、传感器等技术的加速突破和广泛应用&#xff0c;人工智能的发展也进入了一个崭新的阶段。人工智能现已成为国家发展重大战略。智能语音技术作为人工智能产业链上的关键一环&#xff0c;AI应用成熟的技术之一&#xff0c;在…

JavaSE-14笔记【反射机制(+2024新)】

文章目录 1.反射机制概述2.获取Class的四种方式3.通过反射机制实例化对象*4.反射机制结合配置文件灵活实例化对象*5.java.lang.reflect.Field5.1反编译类中的所有字段/属性5.2 通过反射机制给属性赋值* 6.java.lang.reflect.Method6.1反编译类中的所有方法6.2 通过反射机制调用…

深入理解JavaScript - Proxy模拟vue的代理

视频链接 ⚠️视频里使用proxy的代码不能用&#xff01;&#xff01;&#xff01; &#xff08;1&#xff09;简单使用 const obj {a: 1,b: 2,c: {a: 1,b: 2,}, }; let v obj.a; Object.defineProperty(obj, "a", {get() {console.log("读取", a);},se…

STM32之HAL开发—— SRAM控制原理

SRAM&#xff08;Static Random-Access Memory&#xff09; 静态随机存取存储器&#xff08;Static Random-Access Memory&#xff0c;SRAM&#xff09;是随机存取存储器的一种。所谓的“静态”&#xff0c;是指这种存储器只要保持通电&#xff0c;里面储存的数据就可以恒常保…

JAVA获取客户端的真实IP

1.简介 客户端IP地址对于服务器应用非常重要&#xff0c;但Java Servlet API的HttpServletRequest对象提供的getRemoteAddr()方法返回的是代理服务器IP。本文介绍获取客户端真实IP地址的方法。 2.获取IP的方式 以下方法依赖于反向代理服务器的配置&#xff0c;可能不是所有场景…