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. .NET 云原生架构师训练营(权限系统 代码实现 ActionAccess)--学习笔记

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...

  2. 磁盘管理+三剑客之awk

    目录 磁盘管理+三剑客之awk 一.磁盘管理 二.格式化命令awk 1.awk的语法 2.参数 3.awk的生命周期 4.awk中的预定义变量 5.awk处理规则的执行流程 6.awk中的函数 7.a ...

  3. Idea个人配置

    Intellij IDEA配置 1. 优化导包配置 2. 取消tab页单行显示 多行显示更多的文件,方便查看. 3. 双斜杠注释改成紧跟代码头 4. 选中复制整行 原本只会复制你选中的代码,改完配置后 ...

  4. Redis持久化、主从与哨兵架构详解

    目录 Redis持久化 RDB快照(snapshot) AOF(append-only file) AOF重写 Redis 4.0 混合持久化 Redis数据备份策略: Redis主从架构 Redis ...

  5. Jenkins项目迁移JOB

    Jenkins项目迁移JOB:从旧的迁移到新的Jenkins上 北京介绍 今天由于迁移Jenkins服务器,需要完全拷贝Jenkins里的Job. 经实验,直接在服务器上移动Jobs目录下的文件即可. ...

  6. OpenHarmony移植:如何适配utils子系统之KV存储部件

    摘要:本文介绍移植开发板时如何适配utils子系统之KV存储部件,并介绍相关的运行机制原理. 本文分享自华为云社区<OpenHarmony移植案例与原理 - utils子系统之KV存储部件> ...

  7. 使用Java的GUI技术实现 “ 贪吃蛇 ” 游戏

    详细教程: 使用Java的GUI技术实现 " 贪吃蛇 " 游戏_IT打工酱的博客-CSDN博客

  8. RENIX操作之XML报文模板说明——网络测试仪实操

    我们在网络测试仪的日常使用过程中,经常涉及到编辑和修改报文.利用RENIX软件,可以把当前编辑好的报文模板导出为XML文件,下次使用时可以直接导入使用,从而提升测试工作效率.本文以"添加UD ...

  9. C# Control.BeginInvoke、synchronizationcontext.post、delegate.BeginInvoke的运行原理

    背景 用到的知识点 1.windows消息机制 备注:鼠标点击.键盘等事件产生的消息要放入系统消息队列,然后再分配到应用程序线程消息队列.软件PostMessage的消息直接进入应用程序线程消息队列, ...

  10. rlwrap的使用

    转至:http://blog.itpub.net/429786/viewspace-776177/ 在LINUX下使用ORACLE一些命令时(如sqlplus,rman等),经常需要调用上次或之前运行 ...