资源简介

带移植说明的xmodem源码(STM32) //移植时,需要修改该函数 //串口收发,实用查询方式。 void xm_port_write(uint8 *ch) { while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET); USART1->DR = *ch; } //串口接收函数,需要移植 sint8 xm_port_read(uint8 *ch) { if(USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET) { *ch = USART_ReceiveData(USART1); return 1; } return 0; } //在定时中断里调用该函数 //定时时间5ms void xm_timer(void) { xmodem_timeout++; }

资源截图

代码片段和文件信息



#include “xmodem/xmodem.h“

static sint32 last_error = 0;
uint16 xmodem_timeout = 0;

/****************Portting Start *******************/


void xm_outbyte(uint8 trychar)
{
uint8 buf[2];
buf[0] = trychar;
xm_port_write(buf);
}

void xm_timer(void)
{
xmodem_timeout++;
}

uint8 xm_inbyte(uint32 time_out)
{
uint8 ch;

last_error = 0;

//超时管理
xmodem_timeout = 0;
while(xmodem_timeout < time_out)
{
if(xm_port_read(&ch) == 1)
return ch;
}

last_error = 1;
return ch;
}

void *xm_memcpy(void *destaddr void const *srcaddr sint32 len)
{
   uint8 *dest = destaddr;
   uint8 const *src = srcaddr;

   while(len-- > 0)
    *dest++ = *src++ ;
   return destaddr;
}

void *xm_memset(void *src sint32 c sint32 count)
{
 uint8 *tmpsrc=(uint8*)src;
 while(count--)
   *tmpsrc++ =(uint8)c;
 return src;
}

/****************Portting End*******************/
static sint32 xm_check(sint32 crc const uint8 *buf sint32 sz)
{
if (crc) 
{
uint16 crc = xm_crc16_ccitt(buf sz);
uint16 tcrc = (buf[sz]<<8)+buf[sz+1];
if (crc == tcrc)
return 1;
}
else 
{
sint32 i;
uint8 cks = 0;
for (i = 0; i < sz; ++i) 
{
cks += buf[i];
}
if (cks == buf[sz])
return 1;
}

return 0;
}

static void xm_flushinput(void)
{
//xm_inbyte(0);
;
}

void xm_disp(sint8 *str)
{
while(*str)
{
xm_outbyte(*str++);
}
}


uint8 xm_buf[1030]; /* 1024 for XModem 1k + 3 head chars + 2 crc + nul */
sint32 xm_receive(uint8 *dest sint32 destsz)
{

uint8 *p;
sint32 bufsz crc = 0;
uint8 trychar = ‘C‘;
uint8 packetno = 1;
sint32 i c len = 0;
sint32 retry retrans = MAXRETRANS;

xm_disp(“\n\rStart Xmodem Receive!\n\r“);
for(;;) 
{
for( retry = 0; retry < XM_RETRY; ++retry) 
{
if (trychar) 
xm_outbyte(trychar);
c = xm_inbyte((XM_DLY_1S)<<1);
if (last_error == 0) 
{
switch (c) 
{
case XM_SOH:
bufsz = 128;
goto start_recv;
case XM_STX:
bufsz = 1024;
goto start_recv;
case XM_EOT:
xm_flushinput();
xm_outbyte(XM_ACK);
return len; /* normal end */
case XM_CAN:
c = xm_inbyte(XM_DLY_1S);

if (c == XM_CAN) 
{
xm_flushinput();
xm_outbyte(XM_ACK);
return -1; /* canceled by remote */
}
break;
default:
break;
}
}
}
if (trychar == ‘C‘) 

trychar = XM_NAK; 
continue; 
}
xm_flushinput();
xm_outbyte(XM_CAN);
xm_outbyte(XM_CAN);
xm_outbyte(XM_CAN);
return -2; /* sync error */

start_recv:
if (trychar == ‘C‘) crc = 1;
trychar = 0;
p = xm_buf;
*p++ = c;
for (i = 0;  i < (bufsz+(crc?1:0)+3); ++i) 
{
c = xm_inbyte(XM_DLY_1S);

if (last_error != 0) 
goto reject;
*p++ = c;
}

if (xm_buf[1] == (uint8)(~xm_buf[2]) && 
(xm_buf[1] == packetno || xm_buf[1] == (uint8)packetno-1) &&
xm_check(crc &xm_buf[3] bufsz)) 
{
if (xm_buf[1] == packetno)
{
sint32 count = destsz - len;
if (count > bufsz) 
count = bufsz;
if (count > 0) 
{

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5862  2014-01-07 21:45  XMODEM\xmodem.c

     文件        839  2014-01-07 21:44  XMODEM\xmodem.h

     文件       2204  2013-12-24 23:50  XMODEM\xmodem_crc16.c

     文件        514  2014-01-07 21:44  XMODEM\xmodem_hw.c

     目录          0  2014-01-07 21:45  XMODEM

----------- ---------  ---------- -----  ----

                 9419                    5


评论

共有 条评论