协议采用Yomdem协议,spa
Ymodem协议主要有3部分组成:class
1.文件传输开启请求
2.数据传输方法
3.文件传输结束通信
文件传输过程:数据
(1)开启是由接收方开启传输,它发一个大写字母"C"开启传输。而后进入等待(SOH)状态,若是没有回应,就会超时退出。协议
(2)发送方一开始时处于等待过程,等待C。收到C之后,发送(SOH)数据包开始信号,发送序号(00),补码(FF),“文件名”,“空格”“文件大小”“除去序号外,补满128字节”,CRC校验两个字节。进入等待(ACK)状态。word
(3)接收方收到之后,CRC校验知足,则发送ACK。发送方接收到ACK,又进入等待“文件传输开启”信号,即从新进入等待“C”的状态。di
(4)前面接收方只是收到了一个文件名,限制正式开启文件传输,Ymodem支持128字节和1024字节一个数据包。128字节以(SOH)开始,1024字节以(STX)开始。文件
接收方又发出一个“C”信号,开始准备接收文件。进入等待“SOH”或者“STX”状态。
(5)发送接收到“C”之后,发送数据包,(SOH)(01序号)(FE补码)(128位数据)(CRC校验),等待接收方“ACK”。
(6)文件发送完之后,发送方发出一个“ETO”信号,接收方也以“ACK”回应。而后接收方会再次发出“C”开启另外一次传输,若接着发送方会发出一个“全0数据包”,接收方“ACK”之后,本次通讯正式结束。
所用到的符号:
#define MODEM_SOH 0x01 //数据块起始字符
#define MODEM_STX 0x02 //1028字节开始
#define MODEM_EOT 0x04 //文件传输结束
#define MODEM_ACK 0x06 //确认应答
#define MODEM_NAK 0x15 //出现错误
#define MODEM_CAN 0x18 //取消传输
#define MODEM_C 0x43 //大写字母C
CRC计算方法
u16 Crc(u8 *bytes, u32 len)
{
int crc = 0;
int i, j;
for(i = 0; i < len; i++)
{
crc = crc ^ bytes[i] << 8;
for(j = 0; j < 8; j++)
{
if((crc & ((int) 0x8000)) != 0)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
}
}
return crc & 0xFFFF;
}
协议解析
接收方:发出0x43 ("C") 表示请求对方发送数据
发送方:发出第0个数据包
数据包构成:
1:0x01或者0x02;
0x01表示128字节,0x02表示1024字节
2:0x00
表示第0个数据包
3:0xff
第几个数据包的补码
4: 4+ 文名的长度 文件名,以0x00结束
4+ 文件名的长度 +1 文件大小,以0x00结束
正文不足128字节补0x00
Crc校验
接收方:0x06或者0x15
0x06应答,0x15非应答
接收方:0x43 请求对方发送正文
发送方:发出第1个数据包
数据包构成:
1:0x01或者0x02;
0x01表示128字节,0x02表示1024字节
2:0x01 表示第1个数据包
3:0xfe 第几个数据包的补码
4:正文
Crc校验
接收方:0x06或者0x15
注:发送方收到应答后立刻发送第二个数据包直到数据包发送结束后发出0x04
发送方:发出第2个数据包