Qt实现XYModem协议(四)

ops/2024/9/24 23:25:10/

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/ops/16131.html

相关文章

设计模式之享元模式

一、详细介绍 享元模式是一种结构型设计模式&#xff0c;通过共享对象来有效支持大量细粒度对象的复用&#xff0c;减少内存消耗并提高性能。这种模式通过共享已经存在的相同或相似对象&#xff0c;而不是每次请求都创建新的对象&#xff0c;来减少系统中对象的数量&#xff0c…

yolo-驾驶行为监测:驾驶分心检测-抽烟打电话检测

在现代交通环境中&#xff0c;随着汽车技术的不断进步和智能驾驶辅助系统的普及&#xff0c;驾驶安全成为了公众关注的焦点之一 。 分心驾驶&#xff0c;尤其是抽烟、打电话等行为&#xff0c;是导致交通事故频发的重要因素。为了解决这一问题&#xff0c;研究人员和工程师们…

多台机器的docker容器的跨主机ROS通信

docker启动时&#xff0c;会在宿主主机上创建一个名为docker0的虚拟网络接口&#xff0c;默认选择172.17.0.0。docker0只是一个在绑定到这上面的其他网卡间自动转发数据包的虚拟以太网桥&#xff0c;它可以使容器和主机相互通信&#xff0c;容器与容器间通信。 问题是&#xf…

竞赛报名赛事管理系统技术分析

竞赛报名赛事管理系统是一个复杂的应用&#xff0c;涉及到用户管理、赛事信息管理、报名管理、成绩管理等多个方面。使用PHP框架来开发这样的系统&#xff0c;可以大大提高开发效率&#xff0c;保证代码的可维护性和可扩展性。以下是对基于PHP框架的竞赛报名赛事管理系统进行功…

2.6设计模式——Flyweight 享元模式(结构型)

意图 运用共享技术有效地支持大量细粒度的对象。 结构 其中 Flyweight描述一个接口&#xff0c;通过这个接口Flyweight可以接受并作用于外部状态。ConcreteFlyweight实现Flyweight接口&#xff0c;并作为内部状态&#xff08;如果有&#xff09;增加存储空间。ConcreteFlywe…

2024考研复试上岸逆袭,机试部分准备

24考研复试机试准备的题目 主要参考书目《王道机试书》《武大历年机试题》 参考代码地址&#xff1a;https://github.com/baizhu0414/CppFiles 另&#xff0c;由于不允许讨论复试题目&#xff0c;因此在此仅提供几点复习建议&#xff1a; 在牛客网做题&#xff0c;里面有很多大…

Parallels Desktop 19完美中文版 PD19虚拟机详细图文安装教程 亲测兼容M1/M2

对于许多Mac用户来说&#xff0c;运行Windows应用程序是必不可少的。也许你的雇主使用的软件只适用于Windows&#xff0c;或者需要使用依赖于某些Windows技术的网站。或者你想在Mac上玩Windows游戏。或者&#xff0c;你可能需要在其他操作系统上测试应用程序和服务——你可以在…

前端路由的实现原理

当谈到前端路由时&#xff0c;指的是在前端应用中管理页面导航和URL的机制。前端路由使得单页应用&#xff08;Single-Page Application&#xff0c;SPA&#xff09;能够在用户与应用交互时动态地加载不同的视图&#xff0c;而无需每次都重新加载整个页面。 在前端开发中&…