thingcom网络数据收发缓冲区及流程说明
1.数据发送流程 本节主要介绍的是应用层从接收串口数据到处理串口数据并将其写入发送缓冲区(如有需要)的流程,并对发送缓冲区和发送失败缓冲区结构进行了介绍。数据实际从集中器发送给节点的流程请参看《LoRa无人机网络集中器软件架构》3.3节。
1.1整体流程说明 当串口接收到数据后,会首先放到DMA缓冲区中(最长可缓冲1024个字节的数据)。在主函数中,会不断的判断是否接收到串口数据,如果确认收到串口数据,则再读取并处理串口缓冲区的数据。具体流程如图1-1所示。
文章图片
图1-1
1.2发送缓冲区结构说明 发送缓冲区总大小为10k左右,其中包含12个所有节点都可以使用的子缓冲区,这12个子缓冲区每个缓冲区最多可以缓冲4条帧,单条帧长度最长为200字节。具体结构如图1-2所示。在主函数中会不断的循环判断发送缓冲区中是否存在有效数据,如果有,则将其发送给对应节点。
注意:原则上每个节点只能占用一个子缓冲区,一个子缓冲区在被分配给某个节点后只能被用于缓冲对应节点的帧,直到被释放后才可以用于缓冲其他节点的帧。特殊情况下,如果某个节点所对应的缓冲区已存满4条帧,则如果还有剩余缓冲区未使用也可以将他分配给此节点,在这种情况下,单个节点可以最多缓冲8条帧,但这是以同时占用两个缓冲区,减少能够组播的节点上限为代价的,(例如12个缓冲区如果单节点只占用一个缓冲区的情况,可以同时缓冲12个节点的帧,但是如果其中有某个节点占用了两个缓冲区,则只能同时缓冲11个节点的帧 )
文章图片
图1-2
1.3发送失败缓冲区 发送失败缓冲区是为了确保在数据第一次发送失败后,还能继续进行重发,重发次数为3次,如果重发3次仍然失败,则认为此数据帧发送失败。
发送失败缓冲区总大小为4k左右,最多可缓冲20条失败的数据帧,单条数据帧长度最长为200字节,其结构示意图如图1-3所示。
注意:发送失败缓冲区中的帧优先级较低,且每次只重发一条帧,而不是像发送缓冲区一样一次性处理缓冲区中的所有帧(为了避免长时间停留在发送失败缓冲区,而导致发送缓冲区中堆积过多的帧),因此不能保证帧发送的先后顺序。
文章图片
图1-3
【thingcom网络数据收发缓冲区及流程说明】
2.数据接收流程 本节主要介绍的是集中器收到节点的正确数据后将其写入接收缓冲区的流程,并对接收缓冲区结构进行了介绍。数据实际从射频层接收到通知网络层接收数据的流程请参看《LoRa无人机网络集中器软件架构》3.4节。
2.1接收整体流程说明
2.1.1将数据写入接收缓冲区
在确认收到正确的数据后,会首先判断接收缓冲区是否有剩余空闲位置,如有,则将其写入空闲的接收缓冲区,如果缓冲区已满,则丢弃此帧,其处理流程如图2-1所示。在主函数中会不断循环判断接收缓冲区中是否有数据,如果有,则对其进行后续处理。
文章图片
图2.1
2.1.2接收缓冲区数据处理
在数据被写入接收缓冲区某个空闲位置后,会将此位置标志位设为非空闲(可以防止未处理数据被覆盖,同时作为应用层函数判断缓冲区是否有数据的标志)。主循环中会不断判断接收缓冲区中是否有有效数据,如果有则将其发送给对应串口,并且在处理完后将占用的缓冲区重新释放。其处理流程如图2-2所示。
文章图片
图2-2
2.2接收缓冲区结构说明 接收缓冲区结构与发送缓冲区结构相似,接收缓冲区最大可缓冲20条数据帧,每条数据帧长度最长为200字节。每次进入缓冲区处理函数时,都会一次性处理缓冲区中所有被缓冲区的数据。其结构如图2-3所示。
文章图片
图2-3
推荐阅读
- parallels|parallels desktop 解决网络初始化失败问题
- Docker应用:容器间通信与Mariadb数据库主从复制
- 猎杀IP
- 自媒体形势分析
- 数学大作战
- 使用协程爬取网页,计算网页数据大小
- 2018.03.18
- 星期天的下午茶(一)
- Java|Java基础——数组
- Python数据分析(一)(Matplotlib使用)