娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

STM32開發 -- YModem詳解

發布者:一直333最新更新時間:2019-09-02 來源: eefocus關鍵字:STM32  YModem  網絡 手機看文章 掃描二維碼
隨時隨地手機看文章

對 YModem 的接觸,只是在無網絡的情況下,使用SecureCRT軟件輸入loady命令進行串口傳輸,燒寫內核和文件系統。

參看:Hi3516A開發-- 板卡串口燒寫

在這里插入圖片描述

但你要問我 YModem 是個什么東西,我還真說不上來。

接下來,就開始對YModem的一步步剖析詳解!!


一、YModem簡介

參看:XMODEM/YMODEM PROTOCOL REFERENCE

。。。。 網上查了老半天,怎么感覺沒有一篇講的特別清楚的。


1、YMODEM最低要求

聲稱支持YMODEM的所有程序必須滿足以下最低要求

1) 發送程序應在塊0中發送路徑名(文件名)。

2) 路徑名應為空終止的ASCII字符串,如下所述。

對于那些懶得閱讀整篇文檔的人:

3) 除非特別要求,否則僅發送文件名部分。

4) 沒有發送驅動器號。

5) 不區分大小寫的系統,文件名中的字母只能以小寫形式發送路徑名。

6) 接收程序應使用此路徑名作為接收文件名稱,除非明確覆蓋。

7) 當接收程序成功接收到此塊時打開輸出文件,它應該用ACK確認該塊字符,然后繼續正常的XMODEM文件傳輸以接收器發送的“C”或NAK開頭。

8) 發送程序應使用CRC-16響應“C”路徑名nak,否則使用8位校驗和。

9) 接收程序必須接受128和1024字節的任何混合。它接收的每個文件中的塊。發送節目可能會任意切換1024和128字節塊。

10) 發送程序不得更改未確認的長度塊。

11) 在每個文件的末尾,發送程序應發送EOT最多十個直到收到ACK字符為止。 (這是其中的一部分XMODEM規范。)

12) 傳輸會話的結束應由null(空)表示pathname,此路徑名塊應與其他路徑名相同路徑名塊。


1、簡介

參看:YModem協議簡介


最常用的幾種通信傳輸協議有:XModem、YModem、ZModem等。


XModem是最早的協議之一,幾乎所有的通訊程序支持的文件傳輸協議,它傳輸128字節信息塊。


YModem協議是XModem的改進協議,它最用于調制解調器之間的文件傳輸的協議,具有快速,穩定傳輸的優點。它的傳輸速度比XModem快,這是由于它可以一次傳輸1024字節的信息塊,同時它還支持傳輸多個文件,也就是常說的批文件傳輸。


ZModem速度快于XModem和YModem,而且可以更好地斷開后恢復傳輸。


如今,XModem基本已經被淘汰,最常用的就是YModem與ZModem。為了后面YModem升級程序實現做鋪墊,下面就簡單介紹下YModem協議。


YModem分成YModem-1K與YModem-g。


YModem-1K用1024字節信息塊傳輸取代標準的128字節傳輸,數據的發送回使用CRC校驗,保證數據傳輸的正確性。它每傳輸一個信息塊數據時,就會等待接收端回應ACK信號,接收到回應后,才會繼續傳輸下一個信息塊,保證數據已經全部接收。


YModem-g傳輸形式與YModem-1K差不多,但是它去掉了數據的CRC校驗碼,同時在發送完一個數據塊信息后,它不會等待接收端的ACK信號,而直接傳輸下一個數據塊。正是它沒有涉及錯誤校驗,才使得它的傳輸速度比YModem-1K來得塊。


一般都會選擇YModem-1K傳輸,平時所說的YModem也是指的是YModem-1K。


二、YModem傳輸協議

1、起始幀的數據格式

YModem的起始幀并不直接傳輸文件的數據,而是將文件名與文件的大小放在數據幀中傳輸,它的幀長=3字節數據首部+128字節數據+2字節CRC16校驗碼=33字節。它的數據結構如下:

SOH 00 FF filename[ ] filezise[ ] NUL[ ] CRCH CRCL

其中SOH=0x01,表示這個數據幀中包含著128字節的數據部分;在SOH后面的00 FF,00表示數據幀序號,因為是起始幀,所以它的幀序為00,至于FF,它是幀序的取反,YModem特地這么做是為了給數據是否正確提供一種判斷依據,通過判斷這兩個字節是否為取反關系,就可以知道數據是否傳輸出錯;filename[ ]就是文件名,如文件名foo.c,它在數據幀中存放格式為:66 6F 6F 2E 63 00,一定要在文件名最后跟上一個00,表示文件名結束;filesize[ ]就是文件大小,如上面的foo.c的大小為1KByte,即1024Byte,需要先將它轉化成16進制,即0x400,所以它在數據幀的存放格式為:34 30 30 00,即“400”,同樣的文件大小最后需要跟上00,表示結束;NUL[ ]表示剩下的字節都用00填充,數據部分大小為128字節,除去文件名與文件大小占用的空間外,剩余的字節全部用00填充;CRCH CRCL分別表示16位CRC校驗碼的高8位與低8位。


擴展,什么是補碼?

參看:C語言再學習 – 負數


2、數據幀的數據格式

YModem的數據幀中會預留1024字節空間用來傳輸文件數據,它跟起始幀接收差不多,如下:

STX 01 FE data[1024] CRCH CRCL

其中STX=0x02,表示這幀數據幀后面包含著1024字節的數據部分;STX后面的01 FE,01表示第一幀數據幀,FE則是它的取反,當然如果是第二幀數據的話就是:01 FD;data[1024]表示存放著1024字節的文件數據;CRCH與CRCL是CRC16檢驗碼的高8位與低8位。

如果文件數據的最后剩余的數據在128~1024之前,則還是使用STX的1024字節傳輸,但是剩余空間全部用0x1A填充,如下結構:

STX [num] [~num] data[ ] 1A …1A CRCH CRCL

有一種特殊的情況:如果文件大小小于等于128字節或者文件數據最后剩余的數據小于128字節,則YModem會選擇SOH數據幀用128字節來傳輸數據,如果數據不滿128字節,剩余的數據用0x1A填充這是數據正的結構就變成了:

文件大小小于128字節:

SOH 01 FE data[ ] 1A …1A CRCH CRCL

文件最后剩余數據小于128字節:

SOH [num] [~~num] data[ ] 1A…1A CRCH CRCL


3、結束幀數據結構

YModem的結束幀數據也采用SOH的128字節數據幀,它的結構如下:

SOH 00 FF NUL[128] CRCH CRCL

結束幀同樣以SOH開頭,表示后面跟著128字節大小的數據;結束幀的幀序也認為是00 FF;結束幀的128字節的數據部分不存放任何信息,即NUL[128]全部用00填充。


4、文件傳輸過程

YMODEM批量傳輸會話(1個文件)

在這里插入圖片描述


YMODEM批量傳輸會話(2個文件)


在這里插入圖片描述

YMODEM批量傳輸Session-1k塊

在這里插入圖片描述

YMODEM-g傳輸會話(擴展)

在這里插入圖片描述


上面傳輸過程中存在許多通信信號,它們的數值與意義如下表所示:


在這里插入圖片描述

CRC的計算:

參看:STM32開發 – CRC校驗碼

手冊CRC代碼:


/* update CRC */

unsigned short

updcrc(c, crc)

register c;

register unsigned crc;

{

register count;

for (count=8; --count>=0;) {

if (crc & 0x8000) {

crc <<= 1;

crc += (((c<<=1) & 0400) != 0);

crc ^= 0x1021;

}

else {

crc <<= 1;

crc += (((c<<=1) & 0400) != 0);

}

}

return crc;

}


傳輸過程文字描述

接收方發送信號C啟動傳輸會話,然后進入等待(SOH)狀態,如果沒有回應,就會超時退出。

發送方開始時處于等待C過程中。收到C以后,發送攜帶文件名和文件長度的起始幀(SOH)數據包開始信號。進入等待(ACK)狀態

接收方收到SOH起始幀以后,CRC校驗滿足,則發送ACK。發送方接收到ACK,又進入等待“文件傳輸開啟”信號,即重新進入等待“C”的狀態

接收方發送C,表示可以開始數據的傳輸

于是發送方發送數據幀、接收方接收到后回復ACK,如此循環進行數據接收(過程中雙方因為任何異常,如人工終端、通訊故障等都可能造成傳輸中斷).

文件傳輸完畢后,發送方發送EOT信號,接收方收到后,回應NAK

發送方再次發送EOT,接收方回應ACK。

接收方發送C,準備再次文件傳輸

如果是單次文件傳輸,發送方發送傳輸結束幀,接收方回應ACK后,整個傳輸會話結束

接收方和發送方應實現的處理策略

參看:通信協議之YMODEM

共通策略

出錯后需要重復嘗試10次

協議流程應由接收方驅動

使用CAN或ASCII的^X字符來取消傳輸

接收方策略

接收方應該有10s超時機制

只要接收到數據開始,接收方使用1s超時機制來接收每個數據,直到該數據包接收完成。

同步:1.接收到想要的那個數據包并且沒有任何錯誤后才算接收成功,并返回ACK; 2.能夠處理兩條重復的數據包(ACK丟失引起的問題); 3.因為一些特殊原因造成同步出錯應終止傳輸,發送CAN

發送方策略

等待傳輸開始的這段時間,發送方應該設置一個比較長的超時時間,也可以不設置超時時間

文件傳輸結束應該發送EOT到接收方,直到收到一條ACK響應,否則重復發送


三、C語言實現YModem傳輸協議

上面簡單的介紹了一下YModem的傳輸協議。那么問題來了,我想在STM32上用實現,代碼該怎么寫呢?

參看:ST官方代碼——YModem協議部分c代碼分析

參看:STM32F103代碼遠程升級(三)基于YModem協議串口升級程序的實現


下載工程:相關參考工程

網上相關的工程有很多的,接下來就逐一分析一下相關代碼。


1、接收數據

可恥的,直接復制了。。。該博主注釋的相當不錯。我沒什么可說的了。。。


/*******************************************************************************

  * @函數名稱 Receive_Packet

  * @函數說明   從發送端接收一個數據包

  * @輸入參數   data :數據指針

                length:長度

                timeout :超時時間

  * @輸出參數   無

  * @返回參數   接收的結果

                0: 正常返回

                -1: 超時或者數據包錯誤

                1: 用戶取消

*******************************************************************************/

static int32_t Receive_Packet (uint8_t *data, int32_t *length, uint32_t timeout)

{

    uint16_t i, packet_size;

    uint8_t c;

    *length = 0;

    if (Receive_Byte(&c, timeout) != 0)

    {

        return -1;//超時返回-1

    }

    switch (c) //c表示接收到的數據的第一個字節

    {

    case SOH: //數據包開始

        packet_size = PACKET_SIZE;

        break;

    case STX: //正文開始

        packet_size = PACKET_1K_SIZE;

        break;

    case EOT: //數據包結束

        return 0;

    case CA: //發送方中止傳輸

        if ((Receive_Byte(&c, timeout) == 0) && (c == CA))

        {

            *length = -1;

            return 0;

        }

        else

        {

            return -1; //中止傳輸返回-1

        }

    case ABORT1: //A

    case ABORT2: //a

        return 1;

    default:

        return -1;

    }

    *data = c;

    for (i = 1; i < (packet_size + PACKET_OVERHEAD); i ++) //獲取剩下的數據(以字節為單位)

    {

        if (Receive_Byte(data + i, timeout) != 0)

        {

            return -1; //接收數據超時

        }

    }

    if (data[PACKET_SEQNO_INDEX] != ((data[PACKET_SEQNO_COMP_INDEX] ^ 0xff) & 0xff))

    {

        return -1;

    }

    *length = packet_size;

    return 0;

}


/*******************************************************************************

  * @函數名稱 Ymodem_Receive

  * @函數說明   通過 ymodem協議接收一個文件

  * @輸入參數   buf: 首地址指針

  * @輸出參數   無

  * @返回參數   文件長度

*******************************************************************************/

int32_t Ymodem_Receive (uint8_t *buf)

{

    uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD], file_size[FILE_SIZE_LENGTH], *file_ptr, *buf_ptr;

    int32_t i, j, packet_length, session_done, file_done, packets_received, errors, session_begin, size = 0;


    //初始化Flash地址變量

    FlashDestination = ApplicationAddress;


    for (session_done = 0, errors = 0, session_begin = 0; ;)

    {

        for (packets_received = 0, file_done = 0, buf_ptr = buf; ;)

        {

            switch (Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT))

            {

            case 0:

                errors = 0;

                switch (packet_length)

                {

                    //發送端終止

                case - 1:

                    Send_Byte(ACK);

                    return 0;

                    //結束傳輸

                case 0:  /*  數據包中序號和補碼不匹配,終止數據發送*/ 

                    Send_Byte(ACK);

                    file_done = 1;

                    break;

                    //正常的數據包

                default:

                    if ((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff))

                    {

                        Send_Byte(NAK); //發送應答NAK,接收失敗要求重發

                    }

                    else

                    {

                        if (packets_received == 0) //第一包,包含文件名,文件大小

                        {

                            //文件名數據包

                            if (packet_data[PACKET_HEADER] != 0) //去除3個字節的首部,讀取128B的數據包

                            {

                                //文件名數據包有效數據區域

                                //取出文件名--32B用于存儲

[1] [2] [3] [4]
關鍵字:STM32  YModem  網絡 引用地址:STM32開發 -- YModem詳解

上一篇:STM32開發 -- Ublox GPS之設置PUBX
下一篇:STM32開發 -- 看門狗詳解

推薦閱讀最新更新時間:2025-05-01 07:57

STM32 YMODEM實現bootloader
這幾天一直在嘗試學STM32 bootloader,在網上查閱了一番,發現實現方法不計其數。于是自己有了想動手實現一番的欲望。 下面請聽我細細道來,我選用的芯片是STM32F103ZE系類,該芯片是512k,每頁是2k的。 接下來就是你要重點了: 其實bootloader說白了,就是在原有APP程序 再加上另一段程序---bootloader,這個bootloader可以對你flash進行擦寫操作。 那么關于STM32具體實現BOOTLOADER步驟是怎么樣的呢? 下面我就具體幾個細節之處談談: 1,如何實現在APP程序跳轉到BOOTLOADER程序. 2,既然APP程序可以跳轉到bootloader
[單片機]
<font color='red'>STM32</font> <font color='red'>YMODEM</font>實現bootloader
網絡通信之UIP在STM32上的移植
1、什么是UIP協議棧: UIP是一種適用于小型嵌入式通信的TCP/IP協議棧,由瑞典計算機科學院的人開發編寫的,它去掉了完整的TCP/IP中不常用的功能,簡化了通訊過程,但其保留了網絡通信中必須使用的協議,把設計重點放在IP、TCP和ARP協議的實現上。簡單易用、占用資源少是它的設計特點。 2、協議棧接口 UIP協議棧通過一系列接口函數與底層函數和上層應用程序通信,在兩者之中,UIP接口函數處于中間。 其中UIP提供兩個個接口函數給底層系統。分別是 (1)uip_input() 當網卡驅動收到一個輸入包時,將放入全局緩沖區uip_buf中,包的大小由全局變量uip_len約束。同時將調用 uip_input() 函數,這個函
[單片機]
<font color='red'>網絡</font>通信之UIP在<font color='red'>STM32</font>上的移植
基于STM32嵌入式系統的智能控制網絡終端設計
0 引言   智能網絡終端是實現智能化管理的嵌入式終端設備。通常具有安全門禁系統和自動化控制的基本功能。本文重點介紹基于STM32的智能嵌入式終端的網絡控制功能的設計和實現。 1 智能網絡通信實現方案   將嵌入式系統與Internet連接起來實現遠距離信息獲取和控制功能的本質是嵌入式系統本身能夠實現TCP/IP網絡通信協議。該協議的解決方案總體上可分為兩大類。第一類是直接在嵌入式設備上實現TCP/IP,使之直接連上Internet。這實質上是由MCU及內部固化TCP/IP協議的芯片組成應用系統的核心,MCU可以直接撥號上網,這種方法的硬件電路相對簡單,也不需要中間環節的支持。但是由于使用了TCP/IP協議芯片,因此需要大容
[安防電子]
基于<font color='red'>STM32</font>嵌入式系統的智能控制<font color='red'>網絡</font>終端設計
STM32 HAL庫使用中斷實現串口接收不定長數據
以前用DMA實現接收不定長數據,DMA的方法接收串口助手的數據,全部沒問題,不過如果接收模塊返回的數據,而這些數據如果包含回車換行的話就會停止接收,例如接收:ATrnOKrn,就只能接收到ATr,導致沒有接收完成,具體原因還沒搞懂,有了解的,希望可以告知一下,DMA不定長接收方法傳輸門:https://www.cnblogs.com/xingboy/p/9714907.html。 好了,不多說了,現在進入正文。首先建立一個STM32Cumebx的工程,打開串口中斷,完成配置,具體的配置流程就不細說了,沒什么難度就只是打開串口跟中斷而已。 生成工程代碼后,先定義好一些變量: //串口4中斷接收定義 #define MAX
[單片機]
<font color='red'>STM32</font> HAL庫使用中斷實現串口接收不定長數據
《嵌入式-STM32開發指南》第一部分 入門篇 - 第4章 庫開發簡介
4.1 STM32 系統架構 STM32 的系統架構比 51 單片機就要強大很多了。首先我們看看 STM32 的系統架構圖: 圖1 系統架構 STM32 主系統主要由四個驅動單元和四個被動單元構成。 四個驅動單元 ? 內核 DCode 總線; ? 系統總線; ? 通用 DMA1; ? 通用 DMA2; 四被動單元 ? AHB 到 APB 的橋:連接所有的 APB 設備; ? 內部 FlASH 閃存; ? 內部 SRAM; ? FSMC; 下面我們具體講解一下圖中幾個總線的知識: ① ICode 總線:該總線將 M3 內核指令總線和閃存指令接口相連,指令的預取在該總線上面完成。 ② DCode 總線:該總
[單片機]
《嵌入式-<font color='red'>STM32</font>開發指南》第一部分 入門篇 - 第4章 庫開發簡介
Arduino IDE 編寫STM32代碼無下載器 串口下載
準備用STM32的開發板寫一個直流無刷電機BLDC的驅動程序,對Arduino IDE的編程模式比較熟悉,通過相應的插件,Arduino IDE同樣可以支持STM32。 另外因為手頭沒有STM32的下載器,需要通過串口燒錄程序。準備先用一個Samples中的點亮LED的示例來跑通這個STM32的開發流程,沒想到竟然折騰了差不多一天的時間,不懈努力,不輕言放棄,最后才在STM32開發板上,通過Arduino IDE,串口燒錄程序,成功點亮了IDE。看到IDE一閃一閃,體驗了成功的喜悅。 記錄一下折騰的過程。 手頭的STM32開發板的型號為STM32F401CxUx。本來準備買來做USB聲卡的。 STM32F401.JPG
[單片機]
STM32時鐘系統介紹與總結
時鐘樹: 1. HSI振蕩器時鐘 The HSI clock signal is generated from an internal 8 MHz RC Oscillator and can be used directly as a system clock or divided by 2 to be used as PLL input. The HSI RC oscillator has the advantage of providing a clock source at low cost (no external components). It also has a faster startup time than
[單片機]
STM32之Flash
1. 在默認情況下,只有執行FLASH設置(延遲,預取指,半周期)的函數式允許執行的。 如果想要執行FLASH編寫/擦除/保護函數,必須在文件“stm32f10x_conf.h”中定義_FLASH_PROG如下: #define _FLASH_PROG 2.按照不同容量,存儲器組織成32個1K字節/頁(小容量)、128個1K字節/頁(中容量),萬利板子是中容量 #define FLASH_PAGE_SIZE ((u16)0x400) //一頁為1024個字節 3. /* Get pages write protection status */ WRPR_Value = FLASH_GetWriteProte
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 铁力市| 达日县| 黑河市| 肇东市| 大安市| 湖南省| 六枝特区| 同江市| 建平县| 茌平县| 延川县| 嘉祥县| 崇阳县| 石泉县| 元谋县| 黑水县| 丽江市| 大新县| 扶绥县| 三明市| 鄂尔多斯市| 阳原县| 吉木萨尔县| 蒙山县| 资兴市| 舞阳县| 临沂市| 友谊县| 津南区| 南郑县| 浦县| 怀宁县| 涞水县| 盈江县| 天门市| 汤原县| 易门县| 衡阳县| 曲阳县| 新化县| 商都县|