1.寫在前面
??在進行文件傳輸時,為使文件能被正確識別和傳送,需要在兩臺計算機之間建立統(tǒng)一的傳輸協(xié)議,協(xié)議需要包括了文件的識別、傳送的起止時間、錯誤的判斷與糾正等內(nèi)容。常用的文件傳輸協(xié)議有:
【1】ASCII:傳輸速度快最快,但只能傳送文本文件。
【2】Xmodem:協(xié)議古老悠久,傳輸速度較慢,采用了CRC校驗算法,傳輸?shù)臏蚀_率可高達99.6%;每次傳輸信息塊為128字節(jié)。
【3】Ymodem:Ymodem是Xmodem的改進版,每次傳輸信息塊最大1024字節(jié),速度比Xmodem快;同時還支持傳輸多個文件。
【4】Zmodem:Zmodem采用了串流式(streaming)傳輸方式,傳輸速度較快,而且還具有自動改變區(qū)段大小和斷點續(xù)傳、快速錯誤偵測等功能。Zmodem目前最流行的文件傳輸協(xié)議。
??Ymodem協(xié)議用于計算機間傳輸文件,同樣適用于嵌入式領域,如MCU升級固件時,可以使用Ymodem協(xié)議傳輸固件文件,傳輸總線不限于USB、UART、CAN等。
2.Ymodem 幀格式
??Ymodem 有兩種幀格式,主要區(qū)別是信息塊長度不一樣。
名稱 幀頭 包號 包號反碼 信息塊 校驗
簡寫 SOH/STX PN XPN DATA CRC
字節(jié)數(shù) 1 1 1 1024/128 2
2.1 幀頭
??幀頭表示兩種數(shù)據(jù)幀長度,主要是信息塊長度不同。
幀頭 SOH(0x01) STX(0x02)
信息塊長度 128字節(jié) 1024字節(jié)
2.2 包序號
??數(shù)據(jù)包序號只有1字節(jié),因此計算范圍是0~255;對于數(shù)據(jù)包大于255的,序號歸零重復計算。
2.3 幀長度
【1】以SOH(0x01)開始的數(shù)據(jù)包,信息塊是128字節(jié),該類型幀總長度為133字節(jié)。
【2】以STX(0x02)開始的數(shù)據(jù)包,信息塊是1024字節(jié),該類型幀總長度為1029字節(jié)。
2.4 校驗
??Ymodem采用的是CRC16校驗算法,校驗值為2字節(jié),傳輸時CRC高八位在前,低八位在后;CRC計算數(shù)據(jù)為信息塊數(shù)據(jù),不包含幀頭、包號、包號反碼。
3.Ymodem握手信號
??握手信號由接收方發(fā)起,在發(fā)送方開始傳輸文件前,接收方需發(fā)送YMODEM_C (字符C,ASII碼為0x43)命令,發(fā)送方收到后,開始傳輸起始幀。
4.Ymodem起始幀
??Ymodem起始幀并不直接傳輸文件內(nèi)容,而是先將文件名和文件大小置于數(shù)據(jù)幀中傳輸;起始幀是以SOH 133字節(jié)長度幀傳輸,格式如下。
幀頭 包號 包號反碼 文件名稱 文件大小 填充區(qū) 校驗高位 校驗低位
SOH 0x00 0xff File name+0x00 File size+0x00 NULL(0x00) CRC-H CRC-L
??其中包號為固定為0;Filename為文件名稱,文件名稱后必須加0x00作為結束;Filesize為文件大小值,文件大小值后必須加0x00作為結束;余下未滿128字節(jié)數(shù)據(jù)區(qū)域,則以0x00填充。
5.Ymodem數(shù)據(jù)幀
??Ymodem數(shù)據(jù)幀傳輸,在信息塊填充有效數(shù)據(jù)。
幀頭 包號 包號反碼 有效數(shù)據(jù) 校驗高位 校驗低位
SOH/STX PN XPN DATA CRC-H CRC-L
??傳輸有效數(shù)據(jù)時主要考慮的是最后一包數(shù)據(jù)的是處理,SOH幀和STR幀有不同的處理。
【1】對于SOH幀,若余下數(shù)據(jù)小于128字節(jié),則以0x1A填充,該幀長度仍為133字節(jié)。
【2】對于STX幀需考慮幾種情況:
??●余下數(shù)據(jù)等于1024字節(jié),以1029長度幀發(fā)送;
??●余下數(shù)據(jù)小于1024字節(jié),但大于128字節(jié),以1029字節(jié)幀長度發(fā)送,無效數(shù)據(jù)以0x1A填充。
??●余下數(shù)據(jù)等于128字節(jié),以133字節(jié)幀長度發(fā)送。
??●余下數(shù)據(jù)小于128字節(jié),以133字節(jié)幀長度發(fā)送,無效數(shù)據(jù)以0x1A填充。
6.Ymodem結束幀
??Ymodem的結束幀采用SOH 133字節(jié)長度幀傳輸,該幀不攜帶數(shù)據(jù)(空包),即數(shù)據(jù)區(qū)、校驗都以0x00填充。
幀頭 包號 包號反碼 數(shù)據(jù)區(qū) 校驗高位 校驗低位
SOH 0x00 0xff 0x00 0x00 0x00
7.Ymodem命令
命令 命令碼 備注
YMODEM_SOH 0x01 133字節(jié)長度幀
YMODEM_STX 0x02 1024字節(jié)長度幀
YMODEM_EOT 0x04 文件傳輸結束命令
YMODEM_ACK 0x06 接收正確應答命令
YMODEM_NAK 0x15 重傳當前數(shù)據(jù)包請求命令
YMODEM_CAN 0x18 取消傳輸命令,連續(xù)發(fā)送5個該命令
YMODEM_C 0x43 字符C
————————————————
版權聲明:本文為CSDN博主「Acuity.」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_20553613/article/details/88881227