Ymodem协议

ymodem协议

一。简要介绍: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请求结束帧!

四。代码解析

参考文件
Ymodem 协议详解
STM32 Ymodem 协议及代码解析
Ymodem协议-接收

### YModing 协议概述 Ymodem 是一种用于文件传输的技术,在串行通信链路上实现可靠的数据交换[^1]。该协议由 Chuck Forsberg 开发,作为 Xmodem 的改进版本推出。相比于早期的 Modem 文件传输方式,Ymodem 提供了更高效和可靠的机制。 #### 主要特点 - **批量传输支持**:允许一次性发送多个文件而不需要人工干预。 - **更大的数据包大小**:单个数据帧可以携带最多 1024 字节的有效载荷,提高了大文件传输效率。 - **错误检测与纠正**:采用 CRC (Cyclic Redundancy Check) 进行更强健的错误校验[^2]。 #### 工作流程 当使用 Ymodem 协议进行文件传输时: - 发送方会先向接收方发出请求确认信号。 - 接收方回应准备就绪后,发送方便开始逐块传送文件内容。 - 每一块都附带有一个序列号以及计算所得的冗余检验码(CRC),以便于接收端验证接收到的数据完整性。 - 如果某块未能通过CRC检查,则会被标记为失败并重新请求重传直至成功为止。 - 完成整个文件传输之后,还会再次核对总字节数以确保无误。 ```python def ymodem_send(file_path, port): import serial ser = serial.Serial(port) with open(file_path,'rb') as f: while True: data_chunk = f.read(1024) if not data_chunk: break # Simulate sending a chunk and waiting for ACK/NACK ack_received = False retries = 3 while not ack_received and retries > 0: send_data_with_crc(data_chunk, ser) response = receive_response(ser) if response == 'ACK': ack_received = True elif response == 'NACK': retries -= 1 if retries == 0: raise Exception('Failed to transmit block') verify_total_bytes_transferred() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值