MCU的环形FIFO

fifo.h

#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

#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;
}



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值