/**************************************************************************//**
* @file xmodem128.c
* @version V1.00
* $Revision: 3 $
* $Date: 2018.8.14
* @brief
*
* @note
* Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include "Nano100Series.h"
#include "Includes.h"
#define Debug(fmt,args...) ((void *)0)
static uint8_t Buff[REV_BUFF_SIZE];
#define XMODEM_SendByte(a) com_SendByte(a)
#define XMODEM_RevByteSlow(pa) com_RevByte(pa,300)
#define XMODEM_RevByteFast(pa) com_RevByte(pa,3)
#define XMODEM_Delayus(a) com_delayus(a)
uint16_t XMODEM_CheckSum(uint8_t *pBuff,uint8_t Size)
{
uint16_t CheckSum, i;
CheckSum = 0;
while(Size--)
{
CheckSum = CheckSum ^ (int) *pBuff++ << 8;
for(i = 0; i < 8; i++)
{
if(CheckSum & 0x8000) CheckSum = CheckSum << 1 ^ 0x1021;
else CheckSum = CheckSum << 1;
}
}
return CheckSum;
}
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("receve 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;
}
xmodem128 串口下载文件
需积分: 26 27 浏览量
2018-10-23
15:56:42
上传
评论
收藏 2KB RAR 举报
muxi01lingyi
- 粉丝: 12
- 资源: 11
最新资源
- Excel表格筛选工具
- liang新版nacos本地使用方法.zip
- 基于JSP毕业设计-网络购物中心毕业设计(源代码+论文).zip
- 直流电机电磁计算软件Excel版.xlsx
- 1694jsp宿舍管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目源码
- 基于JSP毕业设计-数据库连接池的研究与实现(源代码+论文).zip
- Arduino IDE 2.3.2 windows 64位版本
- zookeeper的设计与使用(集群部署,dubbo,分布式锁,master选举,负载均衡,watch,权限等)
- 头歌python程序设计答案-06-循环语句.ev4.rar
- VIENNA整流器三电平BOOST电路充电机三相三电平交错并联三相PFC电路等资料合集(20个).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈