首页 论坛 物联网专区 物联网弹幕器中循环队列的理解

正在查看 3 帖子:1-3 (共 3 个帖子)
  • 参与人数:3 |  围观次数:974 
  • 陈木木
    陈木木 瓜农

    在之前学习物联网弹幕器时,其中对服务器下发的数据接收用到了循环队列这个概念,

    如果采用顺序队列方式去存储服务器下发的数据,就会导致当数据依次填满后不能插入新的队尾元素;为此会使用循环队列方式,

    基本操作:

    1定义结构体其中包含了,存储数组、队头、队尾、计数信息。

    2判断队列是否为空:

    计数count为0即表示队列为空

    3判断队列是否为满:

    计数count=定义数组长度即表示队列为满,在队列未满时才可以插入新的队尾元素。

    其他如获取队列头的位置、清空队列等操作可以查看技小新物联网弹幕器源码在这就不一一列举

    重点在来了

    循环队列的关键操作我认为在入队与出队。

    1入队一个字节

    ☆当添加一个元素时,(rear+1)%MAXQSIZE; //理解为什么求余就知道循环队列的原理。

    假设队列长度设置为1024,当存完date[1023]这个位置后,下一个存储地址是date[(1023+1)%1024]也就是date[0],如队列前存储的数据已经被提取使用,计数count会相应减小,表示剩余空间可以继续存储新的队尾数据;若count等于定义长度,表示队列已满,不能存入新的队尾数据。

    同样适用在从队列中读取一个字节

    ☆当读取一个元素时,通过(front+1)%MAXQSIZE这样取余操作,将得到相邻下一个数据的位置。

    另外在课程里有关于提取有用数据的方法,个人觉得从一帧数据中通过找到一个像“B”这样一个关键字很容易出错,学习过程中也出现过死循环。在附件中有我的测试程序,简单测试可行,希望大家提出指正,提供一些更好的方法。

    附件:
    1. MQTT.c
    0零妖
    0零妖 吃瓜群众

    兄弟,你理解的很到位!给你点赞!
    例程中,查找 B 的方法,就是一个最通俗,最容易理解的方法。
    你的代码中,找一个字符串,这样的方法更好,你可以把比对字符串的过程,写成一个子函数。
    你可以做的更好!

    LenZ Change
    LenZ Change 吃瓜群众

    兄弟,你的代码在此处有些不够恰当,在读取完关键数据后建议不要继续往下读取,继续读取的话,由于队列长度是最大长度是1024,继续读取队列,很有可能会导致Read_Data(Addr)函数,占用时间过长,甚至无法返回。会导致程序不能及时发送心跳包,导致与服务器断开连接,当然这个应该是不同单片机性能的差异,我这边的反馈就是,继续读取数据的时间过长,导致服务器不能及时发送心跳包。

正在查看 3 帖子:1-3 (共 3 个帖子)

版块 ‘物联网专区’ 已关闭,不允许发布新话题和回复。