该协议为自定义协议,模仿了 YModem-1K 帧结构,每包传输 1K 数据,最后一
包数据根据文件大小决定,为总字节数对 1024 取整。
该协议用 N 字节信息块传输,N 可以自定义,数据的发送会使用 CRC16 校
验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应
ACK 信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接
收。且支持了下位机的序列包定位,当漏发了一包数据,或者需要跳转,当前仅
支持按照 1024 字节整数倍进行文件跳转,该协议不包含结束帧,可根据序列号
进行判断。文件大小应小于 67108864 Bytes,即 64Mbyte。
文件发送篇
1、起始帧的数据格式
起始帧并不直接传输文件的数据,而是将文件名与文件的大小放在数据帧中
传输,它的帧长=4 字节帧头+4 字节文件大小+2 字节包大小+2 字节 CRC16 校验码
+文件名(不定长字符串)。
它的数据结构如下:
AA BB CC DD FileSize[4] PacketSize[2] CRCH CRCL filename[…]
其中 AA BB CC DD,表示这个数据帧为起始帧;在帧头后面的 FileSize [4]表示
文件大小,4 个字节高位在前低位在后;PacketSize[2] 表示每包文件数据大小,
文件将拆分成多个 PacketSize 进行传输;CRCH CRCL 分别表示 16 位 CRC 校验码
的高 8 位与低 8 位,校验的数据为 4 字节文件长度+2 字节包大小;filename[…]
就是文件名,如文件名 foo.c,它在数据帧中存放格式为:66 6F 6F 2E 63 00,
一定要在文件名最后跟上一个 00,表示文件名结束 。
2、数据帧的数据格式
数据帧中会预留 PacketSize 字节空间用来传输文件数据,它跟起始帧接收
差不多,如下:
00 00 data[PacketSize] CRCH CRCL
其中 00 00 表示第一帧数据帧,当然如果是第二帧数据的话就是:00 01;
data[PacketSize]表示存放着 PacketSize 字节的文件数据;CRCH 与 CRCL 是
CRC16 校验码的高 8 位与低 8 位,校验的数据为 data 中的数据。
如果文件数据的最后剩余的数据小于 PacketSize,假设最后一包序列号为
num 的数据,剩余 n 字节数据,且 n< PacketSize,则如下结构:
[num] data[n] CRCH CRCL
3、文件传输过程