完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
哪个大神有新唐的M0或者M4的Xmodem协议例程,当然最好有完整的串口升级例程,那就棒棒哒了
XModem协议介绍: XModem是一种在串口通信中广泛使用的异步文件传输协议,分为XModem和1k-XModem协议两种,前者使用128字节的数据块,后者使用1024字节即1k字节的数据块。 一、XModem校验和协议 1. XModem信息包格式 XModem协议最早由Ward Christensen在20世纪70年代提出并实现的,传输数据单位为信息包,信息包格式如下: --------------------------------------------------------------------------- | Byte1 | Byte2 | Byte3 |Byte4~Byte131| Byte132 | |-------------------------------------------------------------------------| |Start Of Header|Packet Number|~(Packet Number)| Packet Data | Check Sum | --------------------------------------------------------------------------- 2. 校验和的计算 所有的数据字节都将参与和运算,由于校验和只占一个字节,如果累加的和超过255将从零开始继续累加。 3. 字段定义 01H 04H 06H 15H 18H 4. 校验和方式的XModem传输流程 传输流程如图所示: ------------------------------------------------------------------------------ | SENDER | | RECIEVER | | | <--- | NAK | | | | time out after 3 second | | | <--- | NAK | | SOH|0x01|0xFE|Data[0~127]|CheckSum| | ---> | | | | <--- | ACK | | SOH|0x02|0xFD|Data[0~127]|CheckSum| | ---> | | | | <--- | NAK | | SOH|0x02|0xFD|Data[0~127]|CheckSum| | ---> | | | | <--- | ACK | | SOH|0x03|0xFC|Data[0~127]|CheckSum| | ---> | | | | <--- | ACK | | . | | . | | . | | . | | . | | . | | | <--- | ACK | | EOT | ---> | | | | <--- | ACK | ------------------------------------------------------------------------------ 对于发送方仅仅支持校验和的传输方式,接收方应首先发送NAK信号来发起传输,如果发送方没有数据发送过来,需要超时等待3秒之后再发起NAK信号来进行数据传输。对于数据传输正确,接收方需要发送ACK信号来进行确认,如果数据传输有误,则发送NAK信号,发送方在接收到NAK信号之后需要重新发起该次数据传输,如果数据已近传输完成,发送方需要发送EOT信号,来结束数据传输。 5. 如何取消数据传输 当接收方发送CAN表示无条件结束本次传输过程,发送方收到CAN后,无需发送EOT来确认,直接停止数据的发送。 二、XModem-CRC16协议 1. XModem-CRC16信息包格式 XModem协议在90年代做过一次修改,将132字节处的校验和改成双字节的CRC16校验,CRC16校验的信息包格式如下: ------------------------------------------------------------------------------ | Byte1 | Byte2 | Byte3 |Byte4~Byte131|Byte132~Byte133| |----------------------------------------------------------------------------| |Start Of Header|Packet Number|~(Packet Number)| Packet Data | 16Bit CRC | ------------------------------------------------------------------------------ Xmodem协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。然而,这种对每个块都进行认可的策略将导致低性能,特别是具有很长传播延迟的卫星连接的情况时,问题更加严重。 使用循环冗余校验的与Xmodem相应的一种协议称为Xmodem-CRC。还有一种是Xmodem-1K,它以1024字节一块来传输数据。Zmodem是最有效的一个Xmodem版本,它不需要对每个块都进行认可。事实上,它只是简单地要求对损坏的块进行重发。Zmodem对按块收费的分组交换网络是非常有用的。不需要认可回送分组在很大程度上减少了通信量。 Ymodem也是一种Xmodem的实现。它包括Xmodem-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。 Xmodem协议相关控制字符: SOH 0x01 STX 0x02 EOT 0x04 ACK 0x06 NAK 0x15 CAN 0x18 CTRLZ 0x1A 标准Xmodem协议帧格式(每个数据包含有128字节数据) ______________________________________________________________ | | | | | | | SOH | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 | |_____|____________|___________________|__________|____________| 1k-Xmodem帧格式(每个数据包含有1024字节数据) ______________________________________________________________ | | | | | | | STX | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 | |_____|____________|___________________|__________|____________| 说明: SOH: 帧的开头字节,代表信息包中的第一个字节; 信息包序号: 对 256 取模所得到当前包号,第一个信息包的序号为 1 ,而信息包序号范围 0~255; 信息包序号的补码: 当前信息包号的补码; 数据区段: 数据区段的长度固定为 128 字节; 校验和: 1字节的算术校验和,只对数据区段计算后对 256 取模而得。 数据包说明 对于标准Xmodem协议来说,如果传送的文件不是128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用CTRL-Z(0x1A)来填充。如果传送的是bootloader工程生成的.bin文件,mcu收到后遇到0x1A字符会怎么处理?其实如果传送的是文本文件,那么接收方对于接收的内容是很容易识别的,因为CTRL-Z不是前128个ascii码,不是通用可见字符,如果是二进制文件,mcu其实也不会把它当作代码来执行。哪怕是excel文件等,由于其内部会有些结构表示各个字段长度等,所以不会读取多余的填充字符。对于1k-Xmodem,同上理。 启动传输 传输由接收方启动,方法是向发送方发送"C"或者NAK(这里提到的NAK是用来启动传输的,它也可用来对数据产生重传的机制)。接收方发送NAK信号表示接收方打算用累加和校验;发送字符"C"则表示接收方想打算使用CRC校验。 传输过程 当接收方发送的第一个"C"或者NAK到达发送方,发送方认为可以发送第一个数据包,传输已经启动。发送方接着应该将数据以每次128字节的数据加上包头,包号,包号补码,末尾加上校验和,打包成帧格式传送。 发送方发了第一包后就等待接收方的确认字节ACK,收到接收方传来的ACK确认,就认为数据包被接收方正确接收,并且接收方要求发送方继续发送下一个包;如果发送方收到接收方传来的NAK(这里,NAK用来告诉发送方重传,不是用来启动传输)字节,则表示接收方请求重发刚才的数据包;如果发送方收到接收方传来的CAN字节,则表示接收方请求无条件停止传输。 结束传输 如果发送方正常传输完全部数据,需要结束传输,正常结束需要发送方发送EOT 字节通知接收方。接收方回以ACK进行确认。当然接收方也可强制停止传输,当接收方发送CAN 字节给发送方,表示接收方想无条件停止传输,发送方收到CAN后,不需要再发送 EOT确认。 特殊处理 虽然数据包是以 SOH 来标志一个信息包的起始的,但在 SOH 位置上如果出现EOT则表示数据传输结束,再也没有数据传过来。接收方首先应确认数据包序号的完整性,通过对数据包序号取补,然后和数据包序号的补码异或,结果为0表示正确,结果不为0则发送NAK请求重传。 接收方确认数据包序号正确后,然后检查是否期望的序号。如果不是期望得到的数据包序号,说明发生严重错误,应该发送一个 CAN 来中止传输。如果接收到的数据包的包序号和前一包相同,那么m收方会忽略这个重复包,向发送方发出 ACK ,准备接收下一个包。 接收方确认了信息包序号的完整性和是正确期望的后,只对 128 字节的数据区段进行算术和校验,结果与帧中最后一个字节(算术校验和)比较,相同发送 ACK,不同发送 NAK。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9000 浏览 16 评论
4051 浏览 18 评论
1109浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2302浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 13:17 , Processed in 0.980936 second(s), Total 47, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号