<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一、程序实现流程设计
1、模拟文件发送的流程
输入文件发送命令“fsend 0:/pub”,表明超级终端要发送一个文件到开发板的“0:/pub”目录下。
开发板命令处理程序处理过程是这样的:
首先它发出一个大写字母“C”,作为接收方对发送发方的回应。
接着它等待收到一个“SOH”,然后接收“00”“FF”两个字节。接下来的“N个字节”作为文件名字符串存储,然后跳过空格,把后面的“M个字节”作为文件长度字符串存储,再接收两个字节。
然后进行CRC验证,通过后,将“长度字符串”转换为数字。将文件系统当前目录切换到“0:/pub”,然后以创建新文件的方式创建“终端文件”。
再次发送一个大写字母“C”,正式开始文件传输。设置下一个要接收的包号。等待超级终端的数据包。
接收到字符后,首先判断是“SOH”,“STX”还是“EOT”。
如果是“SOH”,接收长度设为128,如果是“STX”,长度设为1024。接下来接收“序号”和“序号补码”,如果不对,则结束传输。然后,把整个包都接收下来,加上后面的两个“CRC校验字节”。校验通过后,将数据缓冲区的数据写入文件。准备接收下一个包,直到文件传输结束。
若是EOT,则表明当前文件发送完成,关闭当前文件,返回“ACK”。进入文件结束传输协商状态。再接收收到一个数据包,发送“ACK”,传输完成。
2、程序结构设计
(1)主体函数
在命令处理程序中先将目录切换到用户指定目录。
然后调用下述函数处理所有剩下的问题:
U8 board_RecvFile ( &ModemDev,&RecvFile);
返回值表明文件接收是否成功,ModemDev是一个Ymodem操作的属性和数据缓冲结构体,由命令处理程序提供空间,在函数内利用指针进行间接操作。RecvFile是一个文件属性和数据缓冲结构体,是FatFs中的数据结构。接收程序利用它操作文件。
如果该函数返回0,终端显示输出完成信息。否则,显示传输错误。
(2)board_RecvFile的结构设计
将接收过程分成三种状态:起始状态、传输中状态、文件传输结束。
初始状态设为起始状态,然后进入状态机处理循环。
起始状态中,发送“C”,接收“文件名”和“长度”,发送“ACK”,再发送一个“C”。设置下一状态为“传输中状态”。
在“传输中状态”中,每次接收后变化的主要是“包序号”。接收到一个包,发送“ACK”。将数据写入文件,状态保持。但是,若接收到“EOT”字符,则发送“ACK”,下一状态设置为“结束传输状态”。
在“结束传输状态”中,由于这里不考虑多个文件传输的问题,实质上由接收方发送一个“C”以后,将接收到得下一个数据包抛弃,再次发送一个“ACK”,然后就可以退出循环了。
用户1320729 2012-8-25 18:29