资源简介
带移植说明的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
- 上一篇:flash 连连看 as3 源码
- 下一篇:weblogic9.2
相关资源
- Scratch源码
- bp神经网络源代码,可直接运行
- E4A无障碍跨程序操作类库(带源码、
- 设备管理系统源码
- 安卓wifi直连app源码
- 我的世界源码(易语言版)
- 随机森林R语言代码
- labview编程软件滤波器以及编写程序设
- 我的界面(visual foxpro)源码
- 计算机图形学 边填充算法实现代码
- 易语言:一键cf基址源码
- 直流无刷电机方波驱动 stm32 例程代码
- 仿知乎界面小程序源代码
- The Secret Path 3D 3D魔方迷宫[源码][scra
- scratch垃圾分类源码(最终版本).sb
- 贪吃蛇源代码.fla
- 周立功开发板ProASIC3实验-syn_FIFO代码
- IMX385驱动代码.zip
- 安卓QQ6.71协议源码易语言,qq协议源码
- 编译原理实验工具及参考源码(lex&
- E盾偷后台工具源码
- UNIX/LINUX编程实践教程的源码
- dotnet 写字板 实验 源代码 不好请要不
- 图像二维小波变换的实现源代码
- 八三编码器设计 VHDL代码 简单,包附
- 十以内加减法练习 powerbuilder源码
- linux应用层的华容道游戏源代码
- 交通咨询模拟系统完整代码
- http请求状态代码
- 数值分析所有实验代码
评论
共有 条评论