原创 【MM32应用笔记】02.使用Xmodem协议实现文件传输功能

2020-5-29 11:27 562 18 4 分类: MCU/ 嵌入式 文集: MM32应用笔记

1.Xmodem协议

Xmodem协议是由Ward Chritensen于70年代提出并实现的,是一种被广泛使用的异步文件传输协议。Xmodem协议传输数据的单位为信息包,每个信息包都包含有一个字节的开始字符、一个字节的信息包序列号、一个字节的信息包序列号反码、N个字节的传输数据和M个字节的校验数据。Xmodem把一个完整的数据划分成多个小的信息包进行传输,每发送一个信息包都会进行校验,如果信息包传输正确,则接收方会发送一个ACK(0x06)应答,要求继续传输下一个数据包;如果信息包有误,则接收方会发送一个NAK(0x15)应答,要求发送方重新传输刚刚的数据包;所以Xmodem协议也是一种发送等待协议,具有流量控制功能。

Xmodem协议分为Xmodem和1k-Xmodem两个版本,前者的传输数据长度为128字节后者的传输数据长度为1024字节。传输多少个字节长度的传输数据是由发送方决定的,当发送方发送的信息包开始字符为SOH(0x01),则表示N等于128字节;当发送方发送的信息包开始字符为STX(0x02),则表示N等于1024字节。每个传输数据的长度都是固定的N个字节,如果传输的数据长度不足N个字节,则使用CTRLZ(0x1A)来填充补全。

Xmodem的校验方式也有两种,一种是累加和校验,对N个字节的数据进行累加和运算,然后对256取余数,此种校验方式的校验数据长度为1个字节;另一种是CRC校验方式,对N个字节的数据进行CRC计算,然后取低16位,此种校验方式的校验数据长度为2个字节。判别使用何种校验方式,是由接收方决定的,接收方在准备接收阶段,会间隔3秒钟给发送方发送一个代表可以开始传输的起始字符,如果发送的是大写字母C,则表示接收方要求发送方以CRC校验的形式对数据进行打包发送;如果发送的是NAK(0x015),则表示接收方要求发送方以累加和校验的形式对数据进行打包发送;接收方在接收到信息包后,也要以同样的方式对数据的正性进行计算校验。

其它理详细的介绍说明可以参考示例代码中的注释^^

2.实现功能

基于eMiniBoard MB-023(MM32L073PF)开发板,使用UART1与PC通讯,实现使用Xmodem协议完成文件传输的功能,包括接收PC下发文件的功能和上传文件给PC的功能;使用UART2实现命令操作选择,及操作提示。

3.参考代码

Xmodem.h头文件

Xmodem.c源文件


4.调试运行

在调试运行过程中,我们使用了个串口工具分别连接了两个串口,使用MobaXterm连接COM3端口(这个是与开发板的UART2相连接的),用来做操作选择输入使用;另外两个分别是HyperTerminal和SecureCRT,它们都与COM12端口连接(同时只能有一个工具连接COM12),COM12是与开发板上的UART1相连接的,用来通过Xmodem协议进行文件传输使用的。


将编译正确的程序下载到开发板运行,UART2串口的信息如下图所示,当按下1键时,开发板接收来自PC发送过来的数据;当按下2时,开发板发送文件数据给PC,PC接收文件数据并保存。


我们先使用HyperTerminal进行调试测试,打开HyperTerminal,选择COM12端口,对通讯参数进行设置,如下图所示:


我们在MobaXterm中输入1,这个时候HyperTreminal收到了开发板发送过来的开始请求,我们可以看到开发板的请求是C,要求PC在发送数据的时候需要使用CRC校验对数据包进行校验和打包。如下图所示:


我们在收到发送请求字符后,点击Transfer->Send File...,如下图所示:


在弹出的发送窗口中,我们先选择协议类型为Xmodem(128字节的传输数据),再选择需要发送的文件,点击发送,如下图所示:


在MobaXterm中显示当前PC通过Xmodem协议发送过来的每一个信息包数据,校验值及处理过程,如下图所示:


如下图是MobaXterm接收到PC以1k-Xmodem协议发送过来的信息包、校验值及过程:


当开发板发送起始字符为NAK时,HyperTerminal显示如下所示,这时开发板要求PC发送的数据校验方式为累加和校验。


如下图所示的是PC以Xmodem协议发送的信息包,信息包是以累加和校验方式打包的,开发板在接收到PC的信息包后,通过MobaXterm显示出来,如下图所示:


接下来我们使用SecureCRT来测试Xmodem协议的收发数据,如下图所示是以CRC校验方式进行的128字节方式进行的传输过程:


选择需要发送的文件,并点击发送,如下图所示:


MobaXterm显示的是开发接到的PC发过来的文件数据,以CRC形式进行的校验,128字节的传输数据长度:


如果是以及CRC的方式进行传输,SecureCRT会显示C的提示字符;但如果是以NAK的方式进行传输,SecureCRT则对不可见的字符显示不出来,如下图所示:


下面我们使用SecureCRT通过Xmodem协议接收开发板的文件数据,操作如下所示:


选择需要保存文件的存储路径及存储文件名,如下图所示:


SecureCRT显示文件接收的信息、速度、时间和错误次数,如下图所示:


在开发板通过Xmodem协议上传文件时,通过MobaXterm显示传输的过程信息,如下图所示:


在PC端我们打开刚刚记录保存的文件,如下图所示,前面是360个字节的有效数据,后面是信息包不满128字节时填充的数据:


使用SecureCRT进行数据文件传输时,传输数据默认是128字节,我们可以根据如下图的操作方式,修改为1024字节的1k-Xmodem协议:



作者: xld0932, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3889467.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
相关推荐阅读
xld0932 2020-05-25 13:22
【MM32应用笔记】01.使用GPIO端口模拟I2C从机通讯
1.I2C总线搜索复制从事嵌入开发的大多都了解I2C总线。I2C总线仅由两根信号线组成,一根为SCL时钟信号线,另一根为SDA数据信号线;双方通过I2C总线协议完成数据的通讯交互。在做这个章节的实验之...
xld0932 2020-05-17 08:38
【MM32学习笔记】18.定时器(TIM)之3路PWM移相输出
1.移相搜索复制MM32高级定时器TIM1的应用功能非常多,本节就输出比较模式下翻转模式的应用做一个移相的应用。简单的说,移相就是相对于之前输出的相位产生了偏差,这个偏差称之为相位差。MM32的TIM...
xld0932 2020-05-14 21:59
【MM32学习笔记】17.定时器(TIM)之输出相位差为180度的PWM
1.输出相位差为180度的PWM搜索复制这一章节我们来产生两路相位差为180度的PWM脉冲信号,占空比和频率都是相同的,只是相位不同; 在上一小节中,我们使用TIM1产生的3组互补带死区的PWM脉冲,...
xld0932 2020-05-14 21:22
【MM32学习笔记】16.定时器(TIM)之带死区控制的3路互补PWM输出功能
1.死区时间搜索复制死区时间是PWM输出时,为了使H桥或者半H桥上的上下晶体管不会因为开关速度的问题而发生同时导通的情况而设置的一个保护时间段,在这段时间内,上下晶体管都不会有输出。而PWM控制的上下...
xld0932 2020-05-12 21:23
【MM32学习笔记】15.定时器(TIM)之PWM输入捕获
1.PWM输入模式搜索复制MM32的高级控制定时器可以工作在输入捕获模式,PWM输入模式是输入捕获模式的一个特例,与输入捕获模式的异同点可以参考用户手册的11.3.7小节的介绍。但有一点需要注意的就是...
广告
EE直播间
更多
我要评论
0
18
广告
关闭 热点推荐上一条 /6 下一条