模拟消息队列

2018-10-30  本文已影响0人  Vieta_Qiu人工智障

使用模拟消息队列可减少掉帧

/**************************************************************************
* @brief: 模拟消息队列
* @author: Vieta
* @copyright: 版权信息
* @version: 版本
* @note: 注意事项
* @history: 历史记录
***************************************************************************/
#include "stm32f4xx.h"
#include "queue.h"

static Queue buf;//声明一个消息队列,初始状态,head和tail都为0;

/**************************************************************************
* @brief     : 把一个字节的数据加入到消息队列
* @param[in] : ch:待加入的数据
* @return    : true:数据入队成功 false:队列已满,入队失败 
***************************************************************************/
bool put(u8 ch)
{
    if (buf._tail+1 == buf._head)//如果在数组里,队列的尾部已经追到头部,说明队列已经满了,返回false,表示不能入队
    return false;

    buf._buffer[buf._tail++] = ch;//把数据追加到队列尾部后,尾部的下标自加一,队列边长,尾部向数组后面移动

    if (buf._tail >= MAX_SIZE)//尾部下标大于队列最大范围,就归零,那下一个加入的数据就加入到buf数组的前面
        buf._tail = 0;

    return true;
}

/**************************************************************************
* @brief     : 从队列中取出一个数据
* @param[in] : ch:待取出的数据
* @return    : true:取出成功 false:队列为空
***************************************************************************/

bool get(u8 *ch)
{
    if (buf._head == buf._tail)//如果在数组里,队列的尾部就是头部,说明队列为空,返回false,无法取得数据
        return false;

    *ch = buf._buffer[buf._head++];//把数据赋值给ch后,头部下标自加

    if (buf._head >= MAX_SIZE)
        buf._head = 0;

    return true;
}

头文件声明队列的结构体

#ifndef __QUEUE_H
#define __QUEUE_H

#include "stm32f4xx.h"
#define MAX_SIZE  256

typedef struct
{
    unsigned short _head;
    unsigned short _tail;
    unsigned char _buffer[MAX_SIZE];
}Queue;

bool put(u8 ch);
bool get(u8 *ch);

#endif

上一篇 下一篇

猜你喜欢

热点阅读