fifo.h
cpp
#ifndef __FIFO_H
#define __FIFO_H
#include "main.h"
#define RINGBUFF_LEN (500) //定义最大接收字节数 500
typedef struct
{
uint16_t Head; // 头指针 指向可读起始地址 每读一个,数字+1
uint16_t Tail; // 尾指针 指向可写的起始地址 每写一个,数字+1,当尾指针超过数组大小,
// 则尾指针又指向数组首地址。
uint16_t Lenght; // 长度
uint8_t Ring_data[RINGBUFF_LEN]; // 数据缓冲区
}RingBuff_t;
uint16_t getRingBuffLenght(RingBuff_t *ringBuff); // 获取缓冲区长度
void initRingBuff(RingBuff_t *ringBuff);
void writeRingBuff(RingBuff_t *ringBuff,uint8_t data); // 写入对应数据
void deleteRingBuff(RingBuff_t *ringBuff,uint16_t size); // 删除对应长度的数据
uint8_t readRingBuff(RingBuff_t *ringBuff,uint16_t position); // 读取对应位的数据
/* 使用示例
1.创建环形队列句柄
RingBuff_t _ringBuff
2.初始化
initRingBuff(&_ringBuff);
3.添加数据
HAL_UART_Receive_IT(&huart2,&_RxBuff[0],1); // 打开串口中断
writeRingBuff(&_ringBuff,tjc_RxBuff[0]);
4. 数据包解析
#define FRAMELENGTH 6 // 数据包的长度
void DataAnalysis()
{
while(getRingBuffLenght(&tjc_ringBuff) >= FRAMELENGTH) // 如果以及接收的数据长于数据包的长度
{
//校验帧头帧尾是否匹配
if(readRingBuff(&tjc_ringBuff,0) != 0x55 ||readRingBuff(&tjc_ringBuff,4) != 0xff || readRingBuff(&tjc_ringBuff,5) != 0xff)
{
deleteRingBuff(&tjc_ringBuff,1); //不匹配删除1字节
}else //匹配
{ // 数据处理 开始
switch (readRingBuff(&tjc_ringBuff,1)) // 判断页面和控件
{
case 0x10: // 左右
break;
default:
break;
}// 数据处理 结束
deleteRingBuff(&tjc_ringBuff,FRAMELENGTH); // 删除对应数据包的
break;
}
}
}
*/
#endif
fifo.c
cpp
#include <stdint.h>
#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <fifo.h>
/********************************************************
函数名: initRingBuff
功能: 初始化环形缓冲区
输入参数:
返回值: void
修改记录:
**********************************************************/
void initRingBuff(RingBuff_t *ringBuff)
{
//初始化相关信息
ringBuff->Head = 0;
ringBuff->Tail = 0;
ringBuff->Lenght = 0;
}
/********************************************************
函数名: writeRingBuff
功能: 往环形缓冲区写入数据 每次写入一个数据
**********************************************************/
void writeRingBuff(RingBuff_t *ringBuff,uint8_t data)
{
if(ringBuff->Lenght >= RINGBUFF_LEN) //判断缓冲区是否已满
{
return ;
}
ringBuff->Ring_data[ringBuff->Tail]=data; //写入到尾数据
ringBuff->Tail = (ringBuff->Tail+1)%RINGBUFF_LEN; //防止越界非法访问 Tail=RINGBUFF_LEN 就为0
//如果Tail指针已经到达缓冲区的末尾,那么Tail+1就会变成0
ringBuff->Lenght++;} // 数据长度+1
/********************************************************
函数名: deleteRingBuff
功能: 删除串口缓冲区中相应长度的数据 从头删除指定长度
输入参数: 要删除的长度
**********************************************************/
void deleteRingBuff(RingBuff_t *ringBuff, uint16_t size)
{
if(size >= ringBuff->Lenght) // 确保小于以有数据
{
initRingBuff(ringBuff);
return;
}
for(int i = 0; i < size; i++)
{
if(ringBuff->Lenght == 0)//判断非空
{
initRingBuff(ringBuff);
return;
}
ringBuff->Head = (ringBuff->Head+1)%RINGBUFF_LEN;//防止越界非法访问
ringBuff->Lenght--;
}
}
/********************************************************
函数名: readRingBuff
功能: 从串口缓冲区读取1字节数据
输入参数: position:读取的位置
返回值: 所在位置的数据(1字节)
**********************************************************/
uint8_t readRingBuff(RingBuff_t *ringBuff, uint16_t position)
{
uint16_t realPosition = (ringBuff->Head + position) % RINGBUFF_LEN;
return ringBuff->Ring_data[realPosition];
}
/********************************************************
函数名: getRingBuffLenght
功能: 获取串口缓冲区的数据数量
返回值: 串口缓冲区的数据数量
**********************************************************/
uint16_t getRingBuffLenght(RingBuff_t *ringBuff)
{
return ringBuff->Lenght;
}
/********************************************************
函数名: isRingBuffOverflow
功能: 判断环形缓冲区是否已满
返回值: 1:环形缓冲区已满 , 2:环形缓冲区未满
**********************************************************/
uint8_t isRingBuffOverflow(RingBuff_t *ringBuff)
{
return ringBuff->Lenght == RINGBUFF_LEN;
}