資源簡介
帶移植說明的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? {
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? {
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? {
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
- 上一篇:flash 連連看 as3 源碼
- 下一篇:weblogic9.2
評論
共有 條評論