SDK: V2014.4

协议: Ymodem

工具: USB转UART转接线、xshell6软件

可实现各种文件传输,大小不限,只是速度很慢

参考原代码如下:

/*******************************************************************************
* @函数名称 YmodemRecvData
* @函数说明 使用Ymodem协议接收数据
* @输入参数 data :数据
size :长度
* @输出参数 无
* @返回参数 数据包的总大小
*******************************************************************************/
int YmodemRecvData(void)
{
int i=0;
char ErrorNum=0; //错误计数
char YmodemState=0;
unsigned char TempChar=0; //接收数据
int crcvalue=0;
int len=0;
int count=0;
ErrorNum=0;
while(1)
{
switch(YmodemState)
{
case 0: //通信起始阶段
SerialPutChar(CRC16); //发起始信号
if(GetKeyC(1000000,&TempChar)==0) //每次等待0.2s钟,发生超时重发“C”
{
if(TempChar==SOH )
{
GetKey(&TempChar);
if(TempChar!=0x00)return ; //不是00序号。
GetKey(&TempChar);
if ( TempChar != 0xFF )return ; //不是00序号补码。
for ( i=0; i<128; i++ )
{ //接收数据包0,共128字节
GetKey((UserBuf+i));
}
GetKey(&TempChar);
GetKey(&TempChar); //丢弃CRC校验,暂时不想实现。 SerialPutChar(ACK); //发送确认信号。
YmodemState=1; //状态切换到数据传输状态
for ( i=0; i<128; i++ )
{ //接收数据包0,共128字节
file_name[i]=0;
}
for ( i=0; (i<128)&&(UserBuf[i]); i++ )
{ //接收数据包0,共128字节
file_name[i]=UserBuf[i];
}
Str2Int((UserBuf+i+1),&PackLen); SerialPutChar (CRC16); //再发一个C,正式启动数据传输
}
}
break;
case 1: //数据传输阶段
GetKey(&TempChar);
switch(TempChar)
{
case EOT: YmodemState = EOT;
SerialPutChar ( ACK );
continue;
case SOH:
len = 128;
break;
case STX:
len = 1024;
break;
case ABORT1:
Serial_PutString("用户取消文件传输!\r\n");
return PackLen;
case ABORT2:
Serial_PutString("用户取消文件传输!\r\n");
return PackLen;
default :return PackLen;
} //end of switch (StartChar)
GetKey(&TempChar);
GetKey(&TempChar);
for(i=0;i<len;i++)
{ //接收整个数据包
GetKey((UserBuf+i));
}
//CRC桥验
GetKey(&TempChar);
crcvalue=TempChar;
crcvalue<<=8;
GetKey(&TempChar);
crcvalue|=TempChar; if(Cal_CRC16(UserBuf,len)!=crcvalue)
{
ErrorNum+=1;
} if(ErrorNum==0)
{
SerialPutChar(ACK);
count+=len;
}
else SerialPutChar(NAK); //接收发现错误,要求重发。
break;
case EOT: //结束传输阶段
SerialPutChar(CRC16);
GetKey(&TempChar); //接收起始字符。
if(TempChar==SOH)
{
GetKey(&TempChar);
if(TempChar!=0x00)return PackLen; //不是00序号。
GetKey(&TempChar);
if(TempChar!=0xFF)return PackLen; //不是00序号补码。
for(i=0;i<128;i++)
{
GetKey((UserBuf+i));
}
//CRC桥验
GetKey(&TempChar);
crcvalue=TempChar;
crcvalue<<=8;
GetKey(&TempChar);
crcvalue|=TempChar; if(Cal_CRC16(UserBuf,128)!=crcvalue)
{
ErrorNum+=1;
}
if(ErrorNum==0)
{
SerialPutChar(ACK);
return PackLen;
}
else SerialPutChar(NAK); //接收发现错误,要求重发。
break;
}
default:
return PackLen;
}
}
return PackLen;
}

结合ZYNQ代码改写如下函数:

void SerialPutChar(uint8_t c)
{
volatile int i = 0;
XUartPs_SendByte(STDOUT_BASEADDRESS, c);
for(i=0; i<1500; i++)
{
;
}
} unsigned char GetKeyC(unsigned int count,unsigned char *key)
{ volatile int i = 0;
volatile unsigned long temp;
for(i=0;i<count;i++)
{ } for(i=0;i<1000;i++)
{
temp = MyUart_RecvByte();
if( (temp &0xFFFFFF00) == 0 )
{
*key = (unsigned char)(temp & 0x000000FF);
return 0;
}
}
return 1;
} uint8_t GetKey(uint8_t *key)
{
volatile unsigned long temp;
volatile int i ; for(i=0; i<1000;i++)
{
temp = MyUart_RecvByte();
if( (temp &0xFFFFFF00) == 0 )
{
*key = (unsigned char)(temp & 0x000000FF);
return (*key);
}
}
return 0;
}

可以通过Ymodem正确传输完成文件,但还存在的问题如下:

1、第一包数据:STX 00 FF .... 的CRC16校验码会变为0xFF或其他不对的值,导致校验失败。而除了第一包后面的校验都是正确的。

2、用xshell6才能正确传输,用超级终端或者secureCRT都会有几包错误数据。且每次都是错的那几包。

3、传输到一半点击取消后,代码不再运行,需要重启。

4、文件传输完成界面不动,必须按下回车键,才会结束传输过程。

ZYNQ使用ymodem协议传输文件的更多相关文章

  1. python调用Moxa PCOMM Lite通过串口Ymodem协议发送文件

    本文采用python 2.7编写. 经过长期搜寻,终于找到了Moxa PCOMM Lite.调用PCOMM.DLL可以非常方便的通过串口的Xmodem.Ymodem.Zmodem等协议传输文件,而无需 ...

  2. 开发错误日志之FTP协议传输文件问题

    从开发端用FTP协议向服务器(Linux系统)传输文件时,cat -A查询文件内容中行尾会有^M出现. 解决方案:改用SFTP协议上传文件.

  3. Netty--使用TCP协议传输文件

    简介: 用于将文件通过TCP协议传输到另一台机器,两台机器需要通过网络互联. 实现: 使用Netty进行文件传输,服务端读取文件并将文件拆分为多个数据块发送,接收端接收数据块,并按顺序将数据写入文件. ...

  4. 一个ftp协议传输文件之后执行脚本无法工作的情况

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述         移植一个文件系统时候,我在window下git clone了对方仓库源码,然后用FileZ ...

  5. 用java pyhont通过HTTP协议传输文件流

    // 代码网上抄的 忘记链接了 抱歉哈package upload; import java.io.BufferedReader; import java.io.DataOutputStream; i ...

  6. YModem协议

    源:YModem协议 YModem协议: YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议. 下面先看下YModem协议传输的完整的握手过程: ...

  7. stm32 Bootloader设计(YModem协议) (转)

    源:stm32 Bootloader设计(YModem协议) 相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootlo ...

  8. Ymodem协议(参考STM32)

    相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootload设计.所以就仔细的去了研究了一翻.以前都是用的stm32官 ...

  9. KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结(转)

    源:KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结 Kermit协议 报文格式: 1.MARK,起始标记START_CHAR,为 0x01(CTRIL-A): 2.LEN,报文剩余 ...

随机推荐

  1. 「Python实用秘技05」在Python中妙用短路机制

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第5期 ...

  2. Solution -「洛谷 P5827」点双连通图计数

    \(\mathcal{Description}\)   link.   求有 \(n\) 个结点的点双连通图的个数,对 \(998244353\) 取模.   \(n\le10^5\). \(\mat ...

  3. 书写高质量sql的一些建议

    It's better to light a candle than to curse the darkness 老生常谈的不要使用select * 如果硬要使用select *,那么就请忍受一下以下 ...

  4. Python基础—基础数据类型list(Day4)

    基础数据类型 四.list列表  存放大量数据,大量的数据在列表中便于操作,列表示有序的,有索引值,可切片,方便取值.  1.list的增    1).append('元素') 在列表后面按元素添加 ...

  5. CentOS8系统上Zookeeper安装启动

    下载Zookeeper安装包,下载地址为:https://zookeeper.apache.org/releases.html.注意选择bin的gz包,否则安装不成功,提示找不到相应的类. 一.单机模 ...

  6. 《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)

    1.简介 今天继续操作Excle,小伙伴或者童鞋们是不是觉得宏哥会介绍第三种工具操作Excle,今天不介绍了,有两种就够用了,其实一种就够用了,今天主要是来介绍如何使用不同的数据类型读取Excel文件 ...

  7. git子模块的使用

    1. 在项目中添加子模块 命令: git submodule add <url> 例子: git submodule add https://github.com/chaconinc/Db ...

  8. shell脚本上传sftp文件

    转至:https://blog.csdn.net/sxh6365966/article/details/83385711 #!/bin/bash #SFTP配置信息 #用户名 YEARS=`date ...

  9. Linux命令(ping-telnet-netstat-curl-ps)

    转至:https://www.jianshu.com/p/577bbd15a6f8 1.ping命令 ping命令用来测试主机之间网络的连通性.执行ping指令会使用ICMP传输协议,发出要求回应的信 ...

  10. Python:绘图添加中文标题

    (20条消息) Python绘图如何显示中文标题_wulei_1107103372的博客-CSDN博客_python画图中文标题 plt.rcParams['font.sans-serif'] = [ ...