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