⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 +

📁 基于Luminary远程在线升级解决方案
💻
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name:               xmodem.c
** Last modified Date:      2008.08.21
** Last Version:            v1.0
** Description:             XMODEM协议驱动
** 
**------------------------------------------------------------------------------------------------------
** Created By:              Weng Heiwei
** Created date:            2008.08.20
** Version:                 v1.0
** Descriptions:
********************************************************************************************************/
#include "../config.h"

/*********************************************************************************************************
** 函数名称: RecFrame
** 功能描述: 接受XMODEM的一帧数据
** 入口参数: oneFrame      帧数据结构变量的地址
**           preblkNum     预测的包号
** 出口参数: 0             接收的帧数据正确
**           1             接收的帧数据错误
*********************************************************************************************************/
static int RecFrame(struct Frame *oneFrame,unsigned char preblkNum)
{
	int returnVal;	

	oneFrame->blkNum = UARTCharGet(UART0_BASE);                           /* 等待接收包号                 */
	oneFrame->blkNumRev = UARTCharGet(UART0_BASE);                        /* 等待接收包号的补码           */
  
  Uart0Receive(oneFrame->dataBlk,BLOCK_SIZE);                           /* 等待接收数据包的128个字节    */
		
	oneFrame->checkSum = UARTCharGet(UART0_BASE);                         /* 等待接收累加校验和           */

	if( (oneFrame->blkNum != 255 - oneFrame->blkNumRev) &&                /* 校验包号补码                 */
      (oneFrame->checkSum == CheckSum(oneFrame)) &&                     /* 校验累加校验和               */
      (oneFrame->blkNum != preblkNum) ) {                               /* 校验预测包号和实际包号       */
	  returnVal = 1;
  }	else {
	  returnVal = 0;
  }
	return (returnVal);	
}
/*********************************************************************************************************
** 函数名称: XmodemRun
** 功能描述: Xmodem协议传输函数
** 入口参数: ptr           Xmodem帧数据接收缓冲区
** 出口参数: true          通信成功
**           false         发送方中止通信 
*********************************************************************************************************/
uint8 XmodemRun(uint8 *ptr)
{	
  
  struct Frame dataFrame;
  uint8 RcvblkNum = 1;                                                  /* 预测的包号                   */
  uint16 count = 0;
  
  do {
    TimeDelay(ONE_SECOND);                                              /* 1S钟的TimeOut                */
    Uart0PutC(NAK);                                                     /* 发送Xmodem的传输起始信号     */
    while(!UARTCharsAvail(UART0_BASE)) {                                /* 判断Xmodem是否建立连接       */
      count++;
      TimeDelay(ONE_SECOND / 200000);
      if(count > 2000) {
        count = 0;
        break;
      }
    }
  } while(!UARTCharsAvail(UART0_BASE));
  
	do {
    switch(UARTCharGet(UART0_BASE)) {                                   /* 获取Xmodem的起始字节         */
		  case SOH:                                                         /* 起始字节为SOH,表示帧起始    */
			  switch( RecFrame(&dataFrame,RcvblkNum) ) {                      /* 接收帧数据                   */
					case 0:                                                       /* 帧数据接收正常               */
					  MemCpy((char *)ptr, (char *)dataFrame.dataBlk, BLOCK_SIZE); /* 拷贝帧数据块                 */
						ptr += BLOCK_SIZE;
            RcvNum +=BLOCK_SIZE;
            RcvblkNum++;                                                /* 包号递增                     */ 
						Uart0PutC(ACK);                                             /* 发送ACK,回应接收正确        */
                                                                        /* 并准备接收下一帧             */
						break;
				  case 1:                                                       /* 帧数据接收错误               */
						Uart0PutC(NAK);                                             /* 发送NAK,告知重新发送该帧    */
						break;	
          default:
            break;
				}		
				break;			
			case EOT:                                                         /* 接收到字节EOT                */
                                                                        /* 表明Xmodem发送端已经发送完毕 */
				Uart0PutC(ACK);                                                 /* 回应ACK表明双方端开连接      */
				*(++ptr) = '\0';		                                            /* 缓冲区加上字符串结束标志'\0' */
        return true;
          
      case CAN:                                                         /* 发送方中止传输               */
       	return false;
					
				default:
					break;	
		}
  } while(1);
}

/*********************************************************************************************************
** 函数名称: MemCpy
** 功能描述: 数据拷贝函数
** 入口参数: des           目的数据缓冲区
**           src           源数据缓冲区
**           length        拷贝的数据长度
** 出口参数: 无
*********************************************************************************************************/
static void MemCpy(char *des, char *src, int length)
{
	int i;
	for(i = 0; i < length; ++i) {
		des[i] = src[i];
	}
}
/*********************************************************************************************************
** 函数名称: CheckSum
** 功能描述: 求累加校验和
** 入口参数: oneFrame      Xmodem帧结构数据
** 出口参数: Xmodem数据区的累加校验和
*********************************************************************************************************/
static unsigned char CheckSum(struct Frame *oneFrame)
{
	int i;
	unsigned char dataSum = 0x00;
	
	for(i = 0; i < BLOCK_SIZE; ++i)	{
		dataSum += oneFrame->dataBlk[i];
	}
  return (dataSum & 0xff);
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -