一。简要介绍:Ymodem协议是一种高效的文件传输协议,主要用于串口通信,广泛应用于嵌入式系统中的固件升级、调试等场景。以下是关于Ymodem协议的详细介绍:
1.协议起源与特点
起源:Ymodem协议由Chuck Forsberg于上世纪90年代开发完成,是Xmodem协议的改进版,解决了Xmodem协议传输效率低、可靠性不足等问题。
特点:
大块数据传输:支持以1024字节(1K)的块进行数据传输,相比Xmodem的128字节块,大大提高了传输效率。
错误纠正:采用循环冗余校验(CRC16)进行错误检测,在发现错误时请求重发数据块,确保数据的正确传输。
批处理模式:允许使用单个命令传输多个文件,在传输大量文件时非常有用。
文件名传输:在发送文件数据之前,先发送文件名和文件大小等信息,以便接收方能够正确地保存文件。
2.协议分类
Ymodem协议分为Ymodem-1K和Ymodem-g。Ymodem-1K每传输一个1024字节的信息块后,会等待接收端的ACK信号,确认后再传输下一个信息块;Ymodem-g则去掉了数据的CRC校验码,且在发送完一个数据块后不会等待接收端的ACK信号,直接传输下一个数据块,因此传输速度更快,但可靠性稍低
二。协议帧格式
1.帧格式 Ymodem有两种帧格式,区别是两者包头长度不一样
帧头:SOH(0x01):数据块128字节, STX(0x02)数据块是1024字节
包号:数据包包号为1个字节 范围:0~255
校验:CRC16校验算法,校验值为2字节,传输时CRC高八在前,低八位在后;CRC计算数据为信息块数据,不包含帧头、包号、包号反码。
起始帧:不直接传输文件内容,而是将文件名与文件大小放在数据帧中传输。帧长为133字节。
格式为:SOH(0x01)+00+FF+filename[]+filesize[]+NULL[]+CRCH+CRCL。
SOH:表示数据帧包含128字节的数据部分;
00:表示数据帧序号,FF为帧序的取反;
filename[]:为文件名,文件名后加0x00表示结束;
filesize[]:为文件大小,文件大小后加0x00表示结束;
NULL[]:表示剩下的字节用0x00填充;
CRC-H和CRC-L:分别为16位CRC校验码的高8位与低8位。
数据帧:预留1024字节空间用来传输文件数据。
格式为:STX(0x02)+PN+XPN+data[1024]+CRCH+CRCL。
STX:表示数据帧包含1024字节的数据部分;
PN:为包号,0~255,传输时递增;
XPN:为PN取反;
data[1024]:表示存放着1024字节的文件数据;
CRC-H与CRC-L:是CRC16检验码的高8位与低8位。
注意最后一包数据的处理:
剩余数据在128~1024,STX的1024字节传输,但剩余空间全部用0X1A填充;
小于等于128字节,SOH128字节传输,不满128字节的部分用0x1A来填充。
结束帧:结束帧采用SOH 133字节长度帧传输,该帧不携带数据(空包),即数据区、校验都以0x00填充。
格式:SOH(0x01)+0x00+0xFF+0x00。
三。文件传输过程
握手信号:由接收方发起,在发送方开始传输文件前,接收方需发送YMODEM_C(字符C,ASCII码为0x43)命令,发送方收到后,开始传输起始帧。
起始帧传输:发送方发送包含文件名和文件大小的起始帧,接收方收到后发送ACK信号确认。
数据帧传输:发送方开始以1024字节的块发送文件数据,每发送一个数据块后都会等待接收方的ACK信号。如果接收方成功接收到数据块并通过CRC校验,则发送ACK信号;否则,发送否定确认信号(NAK)请求重发。
结束帧传输:文件数据传输完成后,发送方发送结束帧(EOT),接收方收到后再次发送ACK信号确认,完成此次文件传输。
还是有几点需要说明下:
1)EOT信号由发送端发送
2)CA中止传输信号也有发送端发送
3)C的含义在英文的数据手册上的意思有点难以理解,我个人理解成请求数据包,如开始传输的发送C请求起始帧数据,然后再发送C请求文件数据帧,最后有发送一次C请求结束帧!
四。代码解析