资源简介
带移植说明的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
相关资源
- flash 连连看 as3 源码
- 编译原理实验 求first集和follow集 代码
- weka 中j48源码解析
- CSharpModBusExample
- avi播放软件代码,可以播放avi文件的
- 微信小程序1800套源码+视频教程
- 基于单片机的智能照明系统
- 有限元法工具代码
- 海面风场融合代码
- 为机器唯一Lisence动态加密及校验的完
- 列表库GridCtrl,包含源码、说明和两种
- TCP Westwood源代码
- 50MHz逐步分频器VHDL代码
- OpenGL shader 代码,可正常编译,完美
- linux0.12源码+linux源码剖析0.12PDF+linux源
- SpringBoot开发第一个Web应用代码
- 东北大学软件学院历年操作系统实验
- 计算机操作系统课程设计
- 最大流/最小割的push-relabel算法的代码
- 安卓课程表源代码
- 易语言 组件随窗口大小变化而变化源
- 机器码转汇编代码的工具
- 普通dijkstra代码加改进后的dijkstra代码
- 传智播客shiro视频源代码资料.txt
- OpenCv2 轮廓提取源代码VS2008
- pb实现http文件功能--源代码 可以直接
- BMP180气压模块资料源码
- MTK平台st7796s驱动代码
- 五子棋,C语言代码,dos环境支持鼠
- 尚硅谷Vue硅谷外卖项目视频包含完整
评论
共有 条评论