a,xmodem128包格式
传输启动,数据接收方向发送方发送C来启动传输
传输结束,1,发送方发送EOT字节,通知接收方数据发送完成;2,接收方发送CAN,通知发送方强制结束
代码链接:https://download.youkuaiyun.com/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;
}