📄 xmodem.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 + -