硬汉嵌入式论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: eric2013
收起左侧

[BSP视频教程] BSP视频教程第22期:基于串口的XYZmodem文件传输协议实现,含上位机和下位机全开源,制作了一个Ymodem方式固件更新(2022-08-08)

  [复制链接]

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-8-22 14:56:25 | 显示全部楼层
硬汉哥,我是初学者,相对于这个Ymodem上位机传输,就是只用命令终端方式进行上位机更新的,还有没有其他的参考材料啊 ,为啥我看用这个方式的就搜到了只有你使用了
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-8-22 14:58:58 | 显示全部楼层
有没有其他的关于升级的,命令终端方式进行升级的,最近自学就找到了你使用这个,没有其他的可以参考的了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2024-8-23 08:31:09 | 显示全部楼层
HeTuii 发表于 2024-8-22 14:56
硬汉哥,我是初学者,相对于这个Ymodem上位机传输,就是只用命令终端方式进行上位机更新的,还有没有其他的 ...

制作Ymodem上位机的玩家不多,很多人都是用现成的。

其他资料可以看Ymodem的规格书。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-8-23 12:50:03 | 显示全部楼层
关于 如果文件数据的最后剩余的数据在128~1024之前,则还是使用STX的1024字节传输,但是剩余空间全部用0x1A填充。
这段说明,上位机发送中,好像代码中没有体现出来
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2024-8-24 08:50:34 | 显示全部楼层
HeTuii 发表于 2024-8-23 12:50
关于 如果文件数据的最后剩余的数据在128~1024之前,则还是使用STX的1024字节传输,但是剩余空间全部用0x1A ...

上位机有处理

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: Ymodem_PreparePacket
*	功能说明: 准备发送数据包    
*	形    参: SourceBuf 要发送的原数据
*             data      最终要发送的数据包,已经包含的头文件和原数据
*             pktNo     数据包序号
*             sizeBlk   要发送数据数
*	返 回 值: 无
*********************************************************************************************************
*/
int sendsize = 0;
void Ymodem_PreparePacket(uint8_t *SourceBuf, uint8_t *data, uint8_t pktNo, uint32_t sizeBlk)
{
	uint16_t i, size, packetSize;
	uint8_t* file_ptr;

	/* 设置好要发送数据包的前三个字符data[0],data[1],data[2] */
	/* 根据sizeBlk的大小设置数据区数据个数是取1024字节还是取128字节*/
	packetSize = sizeBlk >= PACKET_1K_SIZE ? PACKET_1K_SIZE : PACKET_SIZE;

	/* 数据大小进一步确定 */
	size = sizeBlk < packetSize ? sizeBlk :packetSize;
	
	/* 首字节:确定是1024字节还是用128字节 */
	if (packetSize == PACKET_1K_SIZE)
	{
		data[0] = STX;
	}
	else
	{
		data[0] = SOH;
	}
	
	/* 第2个字节:数据序号 */
	data[1] = pktNo;
	/* 第3个字节:数据序号取反 */
	data[2] = (~pktNo);
	file_ptr = SourceBuf;

	/* 填充要发送的原始数据 */
	for (i = PACKET_HEADER; i < size + PACKET_HEADER;i++)
	{
		data[i] = *file_ptr++;
	}
	
	/* 不足的补 EOF (0x1A) 或 0x00 */
	if ( size  <= packetSize)
	{
		for (i = size + PACKET_HEADER; i < packetSize + PACKET_HEADER; i++)
		{
			data[i] = 0x1A; /* EOF (0x1A) or 0x00 */
		}
	}

    sendsize += size;
    printf("SendSize = %d\r\n", sendsize);
}
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-8-26 09:42:24 | 显示全部楼层
eric2013 发表于 2024-8-24 08:50
上位机有处理

[mw_shl_code=c,true]/*

是不是默认剩余字节 如果小于1024全部使用SOH了?
没有对128~1024字节的数据进行判断使用STX?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2024-8-27 08:51:15 | 显示全部楼层
HeTuii 发表于 2024-8-26 09:42
是不是默认剩余字节 如果小于1024全部使用SOH了?
没有对128~1024字节的数据进行判断使用STX?

代码里面有判断处理。

[C] 纯文本查看 复制代码
/* 设置好要发送数据包的前三个字符data[0],data[1],data[2] */
    /* 根据sizeBlk的大小设置数据区数据个数是取1024字节还是取128字节*/
    packetSize = sizeBlk >= PACKET_1K_SIZE ? PACKET_1K_SIZE : PACKET_SIZE;
 
    /* 数据大小进一步确定 */
    size = sizeBlk < packetSize ? sizeBlk :packetSize;
     
    /* 首字节:确定是1024字节还是用128字节 */
    if (packetSize == PACKET_1K_SIZE)
    {
        data[0] = STX;
    }
    else
    {
        data[0] = SOH;
    }
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-8-27 11:21:39 | 显示全部楼层
有关于XModem升级的源码吗  
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2024-8-27 13:23:36 | 显示全部楼层
HeTuii 发表于 2024-8-27 11:21
有关于XModem升级的源码吗

只做了Ymodem
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-8-29 09:40:26 | 显示全部楼层

可否来一起  XModem的 呀  哥
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2024-8-29 14:26:23 | 显示全部楼层
HeTuii 发表于 2024-8-29 09:40
可否来一起  XModem的 呀  哥

Xmodem不打算做了。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-10-31 16:00:25 | 显示全部楼层
硬汉哥,假如我想增加发送命令,然后接收到接收方回应的数据,怎么做到呢?现在我已经可以实现XModem的升级了,但是接收方需要上位机发送两次boot命令然后等待20秒才会向外发送C字符
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2024-10-31 16:46:43 | 显示全部楼层
HeTuii 发表于 2024-10-31 16:00
硬汉哥,假如我想增加发送命令,然后接收到接收方回应的数据,怎么做到呢?现在我已经可以实现XModem的升级 ...

你们这个是不是要兼容第3方软件,如果不兼容,直接魔改下就行。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-10-31 16:47:52 | 显示全部楼层
eric2013 发表于 2024-10-31 16:46
你们这个是不是要兼容第3方软件,如果不兼容,直接魔改下就行。

不用兼容
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-10-31 16:49:04 | 显示全部楼层
eric2013 发表于 2024-10-31 16:46
你们这个是不是要兼容第3方软件,如果不兼容,直接魔改下就行。

我现在是通过串口助手发送两次boot,然后等串口助手里可以看到有C字符输出了,就关闭串口助手,立马执行这个上位机就可以升级成功
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2024-11-1 09:04:14 | 显示全部楼层
HeTuii 发表于 2024-10-31 16:49
我现在是通过串口助手发送两次boot,然后等串口助手里可以看到有C字符输出了,就关闭串口助手,立马执行 ...

那你你现在是想把这个串口发送整合到这个上位机上面吗,也行的。
回复

使用道具 举报

11

主题

50

回帖

83

积分

初级会员

积分
83
QQ
发表于 2024-12-14 03:01:24 | 显示全部楼层

Ymodem方式固件更新

本帖最后由 wgco98 于 2024-12-14 20:45 编辑

处理成功了,端口显示“处理完毕”,现在将app中的flash地址改为BootLoader中设置的flash地址,还是不会跳转到app中执行。还是是直接继续运行BootLoader后面的程序,这是为啥?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2024-12-15 09:12:52 | 显示全部楼层
wgco98 发表于 2024-12-14 03:01
处理成功了,端口显示“处理完毕”,现在将app中的flash地址改为BootLoader中设置的flash地址,还是不会跳 ...

确认下执行跳转程序没,确认执行后,看看是不是跳转前没有提供干净的运行环境或者跳转了,但是没有正常执行

APP跳转基本上就是这些问题
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-12-17 09:45:49 | 显示全部楼层
大佬们,有基于QT的YMODEM协议上位机吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2024-12-18 08:12:12 | 显示全部楼层
不值钱的大学生 发表于 2024-12-17 09:45
大佬们,有基于QT的YMODEM协议上位机吗

QT版的没做,不过当前这个是纯C的,可以移植到QT上使用。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2025-1-12 07:18:32 | 显示全部楼层
xyzmodem.c的555行    char* buf = malloc(size);分配了,但是完成后没有释放这个内存
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 03:10 , Processed in 0.052028 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表