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

📄 xmodem.c

📁 arm开发很好的例程
💻 C
字号:
#include <cdefbf532.h>
#include <string.h>
#include "bios.h"
#include "uart.h"
#include "xmodem.h"
#include "utils.h"

UNS32 xmodem_down(UNS32 address)
{
	
    UNS8 	packNO = 1; 
	UNS8 	buffer[256];
	UNS8 	*pBUF=buffer;
	UNS8 	i;
	UNS16 	crc;
	UNS8	*pAPP=(UNS8 *)address;
	UNS32   count;
	UNS8	packNO_in,packNO_in_n;
	
	UNS32	size=0;
	
	
	
	for(count=0;(get_char_no()!=XMODEM_SOH);count++)
	{
		if(count >9000000)
		{	
			put_char(XMODEM_RECIEVING_WAIT_CHAR);
			count = 0;
		}
	}
	
	get_char();
	
                                                                 
	
	
	do 
    { 
        pBUF = buffer;
        
		packNO_in = get_char();
		packNO_in_n = get_char()+packNO_in;
		
		
		
        if ((packNO == packNO_in)&&( packNO_in_n == 0xff)) //核对数据块编号正确 
        {	
        	  
        	for(i=0;i<128;i++)                //接收128个字节数据 
        	{ 
        	   *pBUF = get_char(); 
        	    pBUF++;     
        	} 
        	crc = get_char()<<8; 
        	crc += get_char();            //接收2个字节的CRC效验字 
        	pBUF = buffer;
        	if(calcrc(pBUF,128)==crc)    //CRC校验验证 
        	{    //正确接收128个字节数据 
        	    put_char(XMODEM_ACK);        //正确收到一个数据块 
        	    packNO++;                        //数据块编号加1 
        	    memcpy(pAPP,buffer,128);
        	    pAPP +=128;
        	    size += 128;
        	    
        	} 
        	else 
        	{ 
        	    put_char(XMODEM_NAK);        //要求重发数据块 
        	} 
        	 
    	} 
        else 
        { 

            put_char(XMODEM_NAK);                //要求重发数据块 
        } 
    }while(get_char()!=XMODEM_EOT);                //循环接收,直到全部发完 
    
    
    put_char(XMODEM_ACK);                        //通知PC机全部收到 
    return size;
}



//计算CRC 
UNS16 calcrc(UNS8 *ptr, S16 count) 
{ 
    UNS16 crc = 0; 
    UNS8 i; 
     
    while (--count >= 0) 
    { 
        crc = crc ^ (int) *ptr++ << 8; 
        i = 8; 
        do 
        { 
        if (crc & 0x8000) 
            crc = crc << 1 ^ 0x1021; 
        else 
            crc = crc << 1; 
        } while(--i); 
    } 
    return (crc); 
} 


UNS32 cal_sum(UNS8 *ptr,UNS32 size)
{
	UNS32 sum=0;
	UNS32 i;
	for( i=0;i<size;i++)
	{
		sum += *ptr;
		ptr++;	
	}
	return sum;
}





⌨️ 快捷键说明

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