美女教师 Ymodem传输公约
发布日期:2024-12-22 07:54    点击次数:169

美女教师 Ymodem传输公约

作家:zzssdd2美女教师

E-mail:zzssdd2@foxmail.com

〇、引子

近段时代作念的名目波及到缔造固件OTA升级相干责任,其中灵验到Ymodem公约传输数据,故整理一下Ymodem公约的常识。一是为写上位机/下位机作念准备,二是作念个备忘便于以后用时查阅。

一、标志发挥

公约顶用到的标志过火对应的数值和含义发挥

标志 数值 含义 SOH 0x01 128字节数据包 STX 0x02 1024字节数据包 EOT 0x04 截止传输 ACK 0x06 正确经受修起 NAK 0x15 造作经受修起 CAN 0x18 传输中止 C 0x43 央求数据 二、传输肇端帧

经受方发起传输央求后由发送方发送的第一包数据

帧头 帧序 帧序反码 文献名 文献大小 NULL CRC-H CRC-L SOH 00 FF n Bytes m Bytes x Bytes 1 Byte 1 Byte SOH:默示这个数据帧中包含着128个字节的数据段 00:默示数据帧序号,启动是0,轮番递加(满255从0动手) FF:是帧序号的取反(提供一种数据是否正确的判断依据) 数据段(128byte):文献名 + 文献大小 + NULL 文献名:举例文献名是foo.c,ACSII字符调养为HEX字符便是66 6F 6F 2E 63。它在数据帧中存放门径为66 6F 6F 2E 63 00 ,临了加一个00默示文献名字段截止。 文献大小:假如上头的foo.c文献大小为1024字节,转折成16进制即0x400。它在数据帧中存放门径为34 30 30 00,即ASCII门径的400,临了加一个00默示文献大小字段截止 NULL:数据部分大小为128字节,除掉文献名与文献大小占用的空间外,剩余的x Bytes沿途用00填充 CRC-H和CRC-L离别默示16位CRC校验码的高8位与低8位,校验只针对数据段。 三、传输数据帧

文献本体数据包

帧头 帧序 帧序反码 数据 CRC-H CRC-L STX/SOH num ~num 1024/128 Bytes 1 Byte 1 Byte

STX 默示这帧数据的数据段为1024字节,SOH 默示这帧数据的数据段为128字节

第一包帧序为01,帧序反码为FE,第二包帧序为02,其反码为FD......依此类推

CRC-H和CRC-L离别默示16位CRC校验码的高8位与低8位,校验只针对数据段。

要是文献临了一帧数据在128~1024之间,则使用STX的1024字节传输,然而剩余空间沿途用0x1A填充,如下结构:

-------------------------------------------------------
| STX | num | ~num | data[ ] | 1A ...1A | CRCH | CRCL |
-------------------------------------------------------

要是文献临了一帧数据小于128字节,则遴选SOH的128字节来传输,然而剩余空间沿途用0x1A填充,如下结构:

------------------------------------------------------
| SOH | num | ~num | data[ ] | 1A...1A | CRCH | CRCL |
------------------------------------------------------
四、传输截止帧

发送方发送的临了一包数据

帧头 帧序 帧序反码 数据 CRC-H CRC-L SOH 00 FF NUL[128] 00 00 截止帧雷同以SOH发轫,默示背面随着128字节的数据,截止帧的帧序也以为是00 FF 截止帧的128字节的数据部分不存放任何信息,即NUL[128]沿途用00填充 因为数据段全为00,故校验码也为00 00 五、传输历程

文献的传输分为如下几个阶段进行

勾引porn 阶段1:发起传输央求

经受方给发送方束缚地发送字符'C',以盼愿收到发送方的数据反馈。

经受方->>发送方: Char 'C'
经受方->>发送方: Char 'C'
......
阶段2:肇端帧的发送及说明

发送方收到经受方发来'C'字符,动手发送肇端帧数据。恭候经受方反馈ACK标志,发送方收到ACK标志后恭候经受方发送字符'C'则动手致密传输文献本体。

发送方->>经受方: Start packet
经受方->>发送方: ACK
经受方->>发送方: C
阶段3:文献本体的传输及说明

发送方每发一个文献本体数据包,就期待经受方反馈一个ACK标志,以持续发送下一个包。

发送方->>经受方: Packet 1
经受方->>发送方: ACK
发送方->>经受方: Packet 2
经受方->>发送方: ACK
......
传输过程中的尽头经管

若发送方发完数据包后收到了经受方NAK标志的反馈,则重发此包,直到收到ACK反馈无意超时退出。

发送方->>经受方: Packet n
经受方->>发送方: NAK
发送方->>经受方: Packet n
经受方->>发送方: ACK
发送方->>经受方: Packet n+1
......

若发送方发完数据包后收到了经受方CAN标志的反馈,则住手数据包发送,截止传输。

......
发送方->>经受方: Packet n
经受方->>发送方: ACK
发送方->>经受方: Packet n+1
经受方->>发送方: CAN
中止传输
阶段4:数据传输截止

若发送方已将数据包沿途发完,则发送EOT标志恭候经受方的NAK反馈,当发送方收到NAK后会再次发送EOT恭候经受方的C标志来央求截止帧,发送截止帧后收到经受方的ACK标志则默示本次传输完成

发送方->>经受方: EOT
经受方->>发送方: NAK
发送方->>经受方: EOT
经受方->>发送方: C
发送方->>经受方: Over packet
经受方->>发送方: ACK
传输截止
六、实例发挥

假定以foo.c,大小为4196Bytes(16进制为0x1064)的文献手脚传输对象,则它的传输过程如下:

发送方 传输场地 经受方 <<<<<<<<<<<<<<<< C(央求肇端帧) SOH 00 FF 66 6F 6F 2E 63 00 31 30 36 34 00 NUL[117] CRCH CRCL >>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<< ACK <<<<<<<<<<<<<<<< C(央求数据帧) STX 01 FE data[1024] CRCH CRCL >>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<< ACK STX 02 FD data[1024] CRCH CRCL >>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<< ACK STX 03 FC data[1024] CRCH CRCL >>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<< NAK(经受造作央求重发) STX 03 FC data[1024] CRCH CRCL >>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<< ACK STX 04 FB data[1024] CRCH CRCL >>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<< ACK SOH 05 FA data[100] 1A[28] CRCH CRCL >>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<< ACK EOT >>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<< NAK(反馈截止敕令) EOT >>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<< C(央求截止帧) SOH 00 FF NUL[128] CRCH CRCL >>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<< ACK 七、CRC16校验

数据帧中校验码的策画神色——C话语美女教师

/******************************************************************************************
*	函	数: CRC16_Xmodem
*	描	述: 策画CRC16-Xmodem
*		    多项式x16+x12+x5+1(0x1021) | 启动值0x0000 | 低位在后,高位在前 | 效力与0x0000异或
*	输	入: pData : 数据指针
*			ulSize : 数据长度
*	输	出: CRC16考试码
******************************************************************************************/
uint16_t CRC16_Xmodem(uint8_t *pData, uint32_t ulSize)  
{  
	uint8_t i;
    uint16_t usCRC = 0x0000;  
    
    while (ulSize--)     
    {  
        usCRC ^= (*pData++ << 8);
        for(i = 0; i < 8; i++)  
        {  
            if(usCRC & 0x8000)  
            {
                usCRC = (CRCin << 1) ^ 0x1021;  
            }
            else
            {              
                usCRC = usCRC << 1;
            }
        }  
    }  
    
    return usCRC;  
}  
本站仅提供存储事业,扫数本体均由用户发布,如发现存害或侵权本体,请点击举报。