1. XMODEM协议

XMODEM帧结构按照校验形式分为2种,如下表所示:

校验和校验帧结构

BYTE1 BYTE2 BYTE3 BYTE4~131 BYTE132
头标志 帧序号 ~帧序号 帧数据 累加和校验

CRC校验帧结构

BYTE1 BYTE2 BYTE3 BYTE4~131 BYTE132~133
头标志 帧序号 ~帧序号 帧数据 CRC16校验

其中,头标志定义如下:

定义 说明
SOH 0x01 128字节数据标志
STX 0x02 1024字节数据标志
EOT 0x04 发送结束标志
ACK 0x06 应答标志
NAK 0x15 非应答标志
CAN 0x18 取消发送标志
CRC 0x43 使用CRC16校验标志

BYTE2表示表示当前帧序号,范围从1~255,若超过则从0开始。BYTE3为当前帧号取反,接收方可根据这两个字节校验当前帧是否正确,例如BYTE2为0x01,则BYTE3为0xFE。

BTYE4~BYTE131为需要传输的128字节数据。

若为累加和校验,那么BYTE132表示当前128字节的累加和校验,若为CRC校验,则BYTE132~133表示128字节的CRC校验。

2. XMODEM通信流程

累加和方式校验通信流程如下:

发送 方向 接收
<< NAK
超时
<< NAK
SOH+0x01+0xFE+数据0~127+Checksum >> 接收到数据
<< ACK
SOH+0x02+0xFD+数据0~127+Checksum >> 接收错误
<< NAK
SOH+0x02+0xFD+数据0~127+Checksum >> 接收到数据
未收到 << ACK
SOH+0x02+0xFD+数据0~127+Checksum >> 接收到数据
<< ACK
EOT >> 接收到数据
<< ACK

CRC方式校验通信流程如下:

发送 方向 接收
<< C
超时
<< C
SOH+0x01+0xFE+数据0~127+Checksum >> 接收到数据
<< ACK
SOH+0x02+0xFD+数据0~127+Checksum >> 接收错误
<< NAK
SOH+0x02+0xFD+数据0~127+Checksum >> 接收到数据
未收到 << ACK
SOH+0x02+0xFD+数据0~127+Checksum >> 接收到数据
<< ACK
EOT >> 接收到数据
<< ACK

3. XMODEM设计指标

  XMODEM在设计上,需要满足以下几个指标:
*可移植性,代码与平台无关;
*兼容各种通信方式;
*保证系统结构清晰;
*保证系统可重入性;
*通过接口实现系统调用;
*可支持阻塞与非阻塞方式调用;

4. XMODEM设计实现

4.1. XMODEM接口设计

  根据设计指标,XMODEM系统采用对象方式设计,并通过接口方式调用实现可移植、通信兼容、以及可重入性的特性,如下图所示:

  在设计上,XMODEM以对象方式提供相关配置接口,在初始化过程中,只需传递相关XMODEM对象,同样在处理过程中传入对应XMODEM对象即可,从而保证系统的可重入性。
与此同时,XMODEM向外界提供三个接口用于数据交互,它们分别为:

  1. 数据通信发送回调接口,该接口由用户实现,可配置成任意通信接口,XMODEM通过调用此接口向对方发送数据;
  2. 数据通信接收回调接口,该接口由用户实现,可配置成任意通信接口,XMODEM通过调用此接口从对象接收数据;
  3. 上层数据回调接口,当XMODEM接收到有效帧数据时,会调用此回调函数通知上层应用数据到达,用户可自行在此函数中实现相关功能;

4.2. 阻塞与非阻塞支持设计

  一般来说,在数据通信的处理过程中,存在两种数据接收方式,阻塞和非阻塞,其中阻塞方式常用于操作系统,当请求数据接收时,程序会被挂起,直到数据有效或者超时的时候才会继续运行。对于非阻塞方式,当请求数据时,如果此时数据有效,则返回数据,否则返回数据无效。为此,XMODEM系统在“数据通信接收回调接口”中增加返回状态标志来指示当前系统该如何运行。其示意如下图所示:

  在上图中,“需要等待”这个状态只有在非阻塞函数中才需要用到,其他情况只用到“收到数据”和“超时”状态。每次XMODEM调用数据接收回调后,会根据返回结果进行下一步操作。

4.3. XMODEM系统流程设计

  为保证系统整体结构清晰与可控,XMODEM在流程上采用状态机方式实现,其实现流程如下图所示:

  在XMODEM启动后,首先进入空闲模式,在此模式下,XMODEM无任何操作,一旦XMODEM接收到启动请求,则切换到就绪模式。
在就绪模式下,系统会向外发送一个回显标志,随后等待接收,系统会根据接收结果切换到以下几种模式:
就绪模式:接收超时,但等待次数未超阈值,那么再次发送回显标志,并等待接收;
接收模式:接收到第一个帧数据并且数据有效,那么切换到接收模式;
取消模式:收到停止请求,或者接收过程出现故障,那么切换到取消模式;
停止模式:接收到EOT结束标志,或等待次数达到阈值,则切换到停止模式;
在接收模式下,系统会周期启动接收过程,从发送方获取数据,并根据数据处理结果切换到以下几种模式:
接收模式:当前接收超时但尝试次数未超阈值,或数据接收正常,那么再次启动接收过程;
完成模式:当前收到EOT帧,此时切换到完成模式;
取消模式:收到停止请求,接收过程出现故障,以及尝试次数达到阈值,则切换到取消模式;
在完成模式下,系统调用数据回调通知上层传输完成,复位XMODEM系统,并切换到空闲模式。
在取消模式下,系统会向发送方发送CAN标志,用于指示当前传输被取消,随后切换到停止模式。
在停止模式下,系统会调用数据回调通知上层当前传输无效,并复位XMODEM,随后切换到空闲模式。

XMODEM设计与C代码实现(1.整体设计篇)相关推荐

  1. linux简单设计与实现代码,《linux内核设计与实现》第五章(示例代码)

    第五章 系统调用 一.与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层.作用: 为用户空间提供了一种硬件的抽象接口. 系统调用保证了系统的稳定和安全. 每个进程都运行在虚拟系统中,而在 ...

  2. 仅仅是又多了一本设计书吗 《软件框架设计的艺术》序

    读者也许会想:"在程序开发领域中,讲述软件设计的技术图书是不是太多 了?",的确如此,因而你有理由来质疑,为什么我还要写一本这样的书而你又凭什么还要再读这样一本书?说起软件设计的经 ...

  3. 彩灯控制器课程设计vhdl_基于VHDL的彩灯控制器设计与实现毕业设计(DOC毕业设计论文)...

    基于VHDL的彩灯控制器设计与实现毕业设计(DOC毕业设计论文) <计算机组成原理>课程设计报告目 录任务书 .2摘 要 .5Abstract .61 引 言 71.1VHDL 技术介绍7 ...

  4. STM32 四轴无人机的设计——代码整体设计

    1.前言 从现在开始我们要接触一个完整的工程,所以我们要对整个工程进行分析,将硬件设计.软件设计模块化,一个模块一个模块的完成,最后将各个模块融合在一起,就是我们整个工程.模块化设计是现在代码开发非常 ...

  5. XMODEM设计与C代码实现(2.代码设计篇)

    1. 关键数据定义   在上一篇中,我们对XMODEM的系统结构以及关键流程进行了详细设计,所以,我们在设计代码前,先对几个重要的数据进行定义,相关的解释我都写在注释中. typedef enum x ...

  6. MindInsight训练可视整体设计介绍

    MindInsight训练可视整体设计介绍 MindInsight是MindSpore的可视化调试调优组件.通过MindInsight可以完成训练可视.性能调优.精度调优等任务. 训练可视功能主要包括 ...

  7. 用thinkphp进行微信开发的整体设计思考

    用thinkphp进行微信开发的整体设计思考 http://www.2cto.com/weixin/201504/388423.html 2015-04-09      0个评论       作者:明 ...

  8. 原理分析之二:框架整体设计

    1.引言 本文主要讲解Mybatis的整体程序设计,理清楚框架的主要脉络.后面文章我们再详细讲解各个组件. 2.整体设计 2.1 总体流程 (1)加载配置并初始化       触发条件:加载配置文件 ...

  9. 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记

    对Verilog 初学者比较有用的整理(转自它处) 作者: Ian11122840 时间: 2010-9-27 09:04 标题: 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记 所谓综 ...

最新文章

  1. 运行在CentOS7.5上的Django项目时间不正确问题
  2. 历经5轮审稿被拒,那个“​没有Science,没有娃”的交大博士,最终申诉成功发顶刊,他说做科研,要尽全力再坚持一下......
  3. hbase-admin:一款简陋的hbase数据查询工具(支持2.2.6)
  4. Go语言基础:method
  5. leetcode :string字符串和数字
  6. 设计模式系列之单例模式(java)
  7. hibernate删除记录_Hibernate记录:常见问题的提示和解决方案
  8. JAVA入门级教学之(public class和class的区别)
  9. 十分钟释疑Oracle中“小表超慢”之谜(SQL调优/SQL优化)
  10. libvirt 用c语言编译,基于C语言libvirt API简单小程序
  11. 终于实现不同站点间list共享了!哈哈
  12. vba html 教程 pdf,Word VBA教程:CanvasShapes集合
  13. Windows10 隐藏更新小工具
  14. 实现qq空间自动化点赞
  15. Java如何使用IP代理
  16. UOJ #449.【集训队作业2018】喂鸽子 min-max容斥
  17. 微软中国艰难前行:业绩遭遇连续跳票
  18. Python基础之列表、元组、字典、集合的使用
  19. 智合同丨AI智能审核工具
  20. 开学之际被Turkey问候,只能祭出正则大法

热门文章

  1. word标签功能:如何快速制作批量产品贴纸标签
  2. 大数据之Presto
  3. 什么是DOM?你了解DOM树吗?
  4. 微信跳一跳自动执行代码剖析
  5. 四川盛迈坤电商:怎么样打造特色网店
  6. rc4加密算法c语言代码,RC4加密算法C语言实现.docx
  7. android tv 不显示不出来,android tv 信源不一致问题
  8. 阿里云 mysql升级_如何升级阿里云MySQL实例的版本?
  9. html测试桩,灌注桩要做哪几种检测
  10. HR不得不知的Excel技能——数据格式篇