MCU的环形FIFO

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;
}
相关推荐
网易独家音乐人Mike Zhou5 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
zy张起灵5 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
lantiandianzi12 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
哔哥哔特商务网12 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件
跟着杰哥学嵌入式12 小时前
单片机进阶硬件部分_day2_项目实践
单片机·嵌入式硬件
电子科技圈13 小时前
IAR与鸿轩科技共同推进汽车未来
科技·嵌入式硬件·mcu·汽车
东芝、铠侠总代1361006839314 小时前
浅谈TLP184小型平面光耦
单片机·嵌入式硬件·物联网·平面
lantiandianzi14 小时前
基于单片机中医药柜管理系统的设计
单片机·嵌入式硬件
嵌入式知识大讲堂14 小时前
HDMI数据传输三种使用场景
单片机
黑客呀15 小时前
[系统安全]Rootkit基础
stm32·单片机·系统安全