传输数据:准备循环数据,最大化数据吞吐量,帧长度 ≤ 最大段大小(63 字节)

概述

注意: 从第二个 MTU 块起,串行数据以 TxByte1 开始;不再有控制字节。

步骤

操作

1

将串行数据的第一个数据块复制到 TxByte2 至 TxByteX 中。

2

TxByte1 中创建控制字节。指定帧长度,并设置帧结束检测 = 1。

3

增大 OutputSequence 中的发送序列号。模块在下个循环中将数据复制到传输缓冲区。

4

在使用了 Block Forward 机制情况下,重复步骤 1 至 3,直到以数据块的形式传输了串行数据。模块使用最后一个数据块来检测已达到帧结束点并释放此帧以供发送。新帧可在下一个循环中立即启动。

5

通过循环确认 InputSequence 中数据块的已传输的发送序列号,能够确认这些数据块已被接收。如果发送序列号未被确认,则必须重复执行此程序,即,从第一个未确认的序列号开始。

数据传输流程图:准备循环数据,最大化数据吞吐量,帧长度 ≤ 最大段大小

G-SE-0064573.2.gif-high.gif

 

 

帧长度 > 最大段大小

注意: 从第二个 MTU 块起,串行数据以 TxByte1 开始;不再有控制字节。

步骤

操作

1

将串行数据的第一个数据块复制到 TxByte2 至 TxByteX 中。

2

TxByte1 中创建控制字节。指定段长度,控制字节位置 = 1,以及帧结束检测 = 0。

3

增大 OutputSequence 中的发送序列号。模块在下个循环中将数据复制到传输缓冲区。

4

在使用了 Block Forward 机制情况下,重复步骤 1 至 3,直到以数据块的形式传输了第一段的数据。

5

如果在第一段中仍存在未分配的 TxBytes,那么在控制字节位置 = 1 的情况下,在第一个未分配的 TxByte 中直接启动下一段,并用数据填充其余字节。在控制字节位置 = 0 的情况下,在下一个新的 MTU 中启动下一段。

6

重复步骤 1 至 5,以数据块的形式传输帧段。在最后一段的控制字节中,设置帧结束检测 = 1。模块使用最后一段的最后一个数据块来检测已达到帧长度并释放此帧以供发送。新帧可在下一个循环中立即启动。

7

通过循环确认 InputSequence 中先前数据块/段的已传输的发送序列号,能够确认这些数据块已被接收。如果发送序列号未被确认,则必须重复执行此程序,即,从第一个未确认的序列号开始。

G-SE-0064574.2.gif-high.gif

 

 

示例:划分控制字节和传输数据

要传输一个长度为 27 字节的帧。MTU 大小配置为 7 字节。

G-SE-0064575.2.gif-high.gif

 

 

数据传输流:准备循环数据,最大化组织,以及各步骤的监视)中的图不同,这里会为相同的帧长度和 MTU 大小保存两个 MTU 循环。新帧可在最后一个 MTU 循环 4 之后启动。

在准备或拆分传输数据时,不会考虑是否使用 Block Forward 机制:

o在不使用 Block Forward 机制的情况下,在传输数据传输的各 MTU 循环之后,模块会等待确认发送序列号。

o在使用了 Block Forward 机制的情况下,在下一个循环中立即发送下一个数据块。

进一步优化

如要将帧的最后一个 MTU 块中的可用空间用于下一个帧,则在帧的最后一个控制字节中设置控制字节位置 = 1 标识符。然后便会将最后一个 MTU 块中的第一个未分配的 TxByte 用作下一个帧的控制字节。然后会新帧的串行数据来填充 MTU,直至数据结尾。下一个循环中的串行数据在 TxByte1 中启动。

示例:划分控制字节和传输数据

要传输两个长度分别为 27 字节和 20 字节的帧。MTU 大小设置为 15 字节。

G-SE-0064576.2.gif-high.gif