串口xmodem128下载升级文件

虚拟U盘升级 bootloader

a,xmodem128包格式

传输启动,数据接收方向发送方发送C来启动传输

传输结束,1,发送方发送EOT字节,通知接收方数据发送完成;2,接收方发送CAN,通知发送方强制结束

代码链接:https://download.csdn.net/download/seeker_zeroone/10739176

移植说明:

XMODEM_SendByte               向串口发送一个字符

XMODEM_RevByteSlow        向串口读取一个字符,超时等待时长(200~500mS)

XMODEM_RevByteFast         向串口读取一个字符,超时等待时长为  (1 / 波特率 * 10 bit * 5 字节 )

XMODEM_Delayus                 基础延时

uint8_t	XMODEM_RevPackage(uint8_t	Cmd)
{
	 uint8_t	Temp,Retry,Data;
	 memset(Buff,0,REV_BUFF_SIZE);
	 
	 Retry	= 100;
	 Temp	= 0;
	 while(Retry--)
	 {
		 if(Cmd == 'C')
 		 {
			 Debug("xmodem128 start transmet...\r\n");
 			 XMODEM_Delayus(5000);
 		 }
		 else if(Cmd !=XMODEM_CMD_ACK )
		 {
			XMODEM_Delayus(10000);
		 }
		 else 
		 {
			XMODEM_Delayus(50);
		 }
		 XMODEM_SendByte(Cmd);
	 	if( XMODEM_RevByteSlow( &Data ))
		 {					 		
	 		do
	 		{
	 			if(Temp >= PACKAGE_SIUZE)	
	 			{
	 				Debug("received one pacage\r\n");
					return Temp;
	 			}		
	 			Buff[Temp++]	=Data;	
	 		}while( XMODEM_RevByteFast( &Data) );
	 		return  (Temp);
		 } 	
		 else
		 {
			Debug("receve byte timeout\r\n");
		 }
	}
	return  0;							
}



uint8_t	XMODEM_Loading(void)
{
	uint8_t		NumA,NumB,CMD,StartOk,Retry=0xff;
	uint32_t    RevBytes =0,packageSize=0;
	XMODEMM_TYPE	*MyData;	
			
	MyData		=(XMODEMM_TYPE *)Buff;
	CMD 		='C';			//启动XMODEMM数据传输
	NumA		=0x01;
	StartOk 	=FALSE;

	do
	{
		NumB	=~NumA; 	
		packageSize =XMODEM_RevPackage( CMD );
		if (packageSize  >= PACKAGE_SIUZE) 	//正确的收到了第一包/一个数据
		{	   
			Debug("receve new package\r\n");
			if(( MyData->PackNum1 == NumA)&&(MyData->PackNum0 == NumB))
			{
				//加入数据校验
				StartOk   =TRUE;
				Retry	  =200;
				if( XMODEM_CheckSum(Buff + 3, PACKAGE_SIUZE - 3) == 0x00)
				{							
					 if(image_sotre(Buff + 3, 128))
					 {
						Retry =100;
						NumA++;
						RevBytes+=128;
						CMD =XMODEM_CMD_ACK;
						Debug("storing ok revbyes =%d \r\n",RevBytes);
						continue;
					 }	
					 Retry =0;
				}
				else 
				{
					Debug("package isnt ok\r\n");
					CMD =XMODEM_CMD_NAK;
				}
			}
			else	 
			{
				Debug("package numbuer is wring\r\n");
				CMD =XMODEM_CMD_NAK;
				Retry  --;
			}
		}
		else if( StartOk !=  TRUE)
		{
		   Debug("xmodem start trans again\r\n");
		   CMD	  ='C';
		   NumA   =0x01;
		   Retry  --;
		}					 
		else
		{
			Debug("something has error\r\n");
			CMD 	=XMODEM_CMD_NAK;
			Retry	--; 
		}											
	}while(( MyData->Header!= XMODEM_CMD_EOT)&&(MyData->Header != XMODEM_CMD_CAN)&& Retry );
	if(Retry > 0)
	{
		CMD 	=XMODEM_CMD_ACK;
		XMODEM_SendByte( CMD );
	}
	else
	{
		CMD 	=XMODEM_CMD_DEL;
		XMODEM_SendByte( CMD );
	}
	com_XmodemTransStatus(FALSE);
	if(MyData->Header == XMODEM_CMD_EOT)
	{
		Debug("xmodem received done nbytes=%d\r\n",RevBytes);
		return TRUE;
	}
	else
	{
		Debug("xmodem cancel\r\n");
	}
		
	return FALSE;		
}

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值