使用模拟消息队列可减少掉帧
/**************************************************************************
* @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
网友评论