java ymodem 使用方法_Ymodem协议(参考STM32)

转自:http://www.cnblogs.com/hiker-blogs/archive/2013/03/17/stm32.html

相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些。下文中的bootload就来实现这样的功能。

前段时间有项目关于Bootload设计。所以就仔细的去了研究了一翻。以前都是用的stm32官方的,没有去深入了解。这次做完了过后,发现官方的版本存在一些问题。比如说YModem传送过程中,完全没有对数据区进行效验,只是核对了下编号,就进行烧写。整个程序完全为阻塞式,浪费了大量的cpu做无用功。当然这在升级程序方面也用不了多少时间。有一个重要的问题,官方代码只可以用超级终端进行传输。这样如果你用的是64位的win7,那就没有办法升级。因为只有xp或32位的win7才可以使用 超级终端。64位的win7下超级终端没办法使用。 不过SecureCRT工具到是可以在64位win7使用,但是官方代码不对其支持。SecureCRT下支持的是最原始的YModem协议,第一帧数据包中不包含总字节数。超级终端下的YModem应该是改进版的,所以官方的dome只可以在超级终端下传输。下面会对YModem进行详细说明。就会知道其中的原因。

首先奉上一个精简的Bootloader工程。

支持协议:YModem, YModem-G。

所支持的PC软件:超级终端,SecureCRT。

YModem协议:

YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议。下面有一些相关的文档。这里要感谢关注我微博的一些朋友提供的资料。省去了不少时间。

下面先看下YModem协议传输的完整的握手过程:先看下图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以在STM32芯片上使用YModem协议来实现串行通信。下面是一个基本的YModem协议的发送代码示例(基于HAL库): ```c #include "main.h" #include "stm32f4xx_hal.h" /* 定义YModem协议开始字符 */ #define YMODEM_START_OF_PACKET (0x01) /* 定义YModem协议数据包序号字符 */ #define YMODEM_PACKET_NUMBER (0x00) /* 定义YModem协议结束字符 */ #define YMODEM_END_OF_PACKET (0x04) /* 定义YModem协议文件名字符 */ #define YMODEM_FILE_NAME_PACKET (0x00) /* 定义串口句柄 */ extern UART_HandleTypeDef huart; /* YModem发送函数 */ uint8_t YModem_Send(uint8_t *data, uint32_t length) { uint8_t packet_number = 0x01; // 数据包序号从1开始 uint32_t i, j; /* 发送文件头信息 */ HAL_UART_Transmit(&huart, &YMODEM_START_OF_PACKET, 1, HAL_MAX_DELAY); HAL_UART_Transmit(&huart, &YMODEM_FILE_NAME_PACKET, 1, HAL_MAX_DELAY); HAL_UART_Transmit(&huart, data, length, HAL_MAX_DELAY); /* 发送数据包 */ for (i = 0; i < length; i += 128) { HAL_UART_Transmit(&huart, &YMODEM_START_OF_PACKET, 1, HAL_MAX_DELAY); HAL_UART_Transmit(&huart, &packet_number, 1, HAL_MAX_DELAY); HAL_UART_Transmit(&huart, &(~packet_number), 1, HAL_MAX_DELAY); // 补码校验 for (j = i; j < i + 128; j++) { HAL_UART_Transmit(&huart, &data[j], 1, HAL_MAX_DELAY); } packet_number++; /* 等待接收ACK */ if (HAL_UART_Receive(&huart, &packet_number, 1, 5000) != HAL_OK || packet_number != YMODEM_PACKET_NUMBER) { /* 接收ACK超时或错误 */ return 0; } } /* 发送结束数据包 */ HAL_UART_Transmit(&huart, &YMODEM_START_OF_PACKET, 1, HAL_MAX_DELAY); HAL_UART_Transmit(&huart, &YMODEM_END_OF_PACKET, 1, HAL_MAX_DELAY); /* 等待接收ACK */ if (HAL_UART_Receive(&huart, &packet_number, 1, 5000) != HAL_OK || packet_number != YMODEM_PACKET_NUMBER) { /* 接收ACK超时或错误 */ return 0; } return 1; // 发送成功 } int main(void) { /* 初始化STM32芯片和UART配置等 */ uint8_t file_data[] = "Hello, World!"; // 待发送的文件数据 uint32_t file_length = sizeof(file_data) - 1; // 文件数据长度(去除字符串结尾的null字符) while (1) { /* 按钮检测或触发发送文件操作 */ if (/* 按钮按下或触发发送文件操作 */) { if (YModem_Send(file_data, file_length)) { /* 文件发送成功 */ } else { /* 文件发送失败 */ } } } } ``` 这段代码仅为示例,实际使用时需要根据具体的硬件和应用场景进行适当修改。同时,你还需要确保正确配置STM32的串口参数以及初始化相关代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值