協議採用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個數據包