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. Pandas常用操作 - 删除指定行/指定列

    1. 删除指定行 new_df = df.drop(index='行索引') new_df = df.drop('行索引', axis='index') new_df = df.drop('行索引', ...

  2. 布尔值与比较运算符"=="

    $man = "男";$flag = $man == "男"; //双等号是比较运算符,返回布尔值,成立则返1赋给$flag 不成立返回0,0即为nullech ...

  3. [LeetCode]1464. 数组中两元素的最大乘积

    给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值. 请你计算并返回该式的最大值. 示例 1: 输入:nums = [3 ...

  4. NSSCTF-[SWPU 2020]找找吧

    下载附件得到一个rar的压缩包,解压是需要密码的,直接丢尽winhex(菜狗经验),在最下面可以看到一个KEY is 得到第一个压缩包的密码,解压第一个压缩包得到一个mp3文件和另一个rar压缩包,将 ...

  5. 一文带你看懂HarmonyOS应用上架

    大家一直以来都很关心如何上架HarmonyOS应用,现在它来了!它终于来了! 我们为大家梳理了HarmonyOS应用从创建.调试到上架的流程和注意事项,希望能为你的上架之旅带来帮助! 一.创建/添加应 ...

  6. ensp上防火墙的实现

    使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)一.NAT介绍NAT(Network Address Translation,网络地址转换):简单来说就是将内部私有地址转换成公网地 ...

  7. ctf linux 基本命令

    从网站上下载一个tar.gz的安装包,在linux下解压缩. 获得一个flag的二进制文件. 通过linux的grep命令搜索到key. grep命令参数中文说明

  8. [题解]UVA10129 Play on Words

    链接:http://vjudge.net/problem/viewProblem.action?id=19492 描述:单词接龙 思路:求欧拉回路或欧拉道路. 首先建图,以字母为节点,单词为边.因为单 ...

  9. 零基础小白也能用的商业智能BI工具,自助式就是香!

    ​随着数字化时代的到来,数据已经成为企业无形的资源,企业对员工的数据分析能力也提出了新的要求.掌握一定的数据分析能力无疑会大大增加自己在职场中的竞争力,但并不是所有人都具备专业的数据分析基础,尤其是虽 ...

  10. Vue 常用命令

    创建全局脚手架 npm install -g @vue/cli-init # `vue init` 的运行效果将会跟 `vue-cli@2.x` 相同 vue init webpack my-proj ...