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;
}
相关推荐
枯无穷肉44 分钟前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名6771 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式大圣1 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室2 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费2 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件
qq_397562314 小时前
MPU6050 , 设置内部低通滤波器,对于输出数据的影响。(简单实验)
单片机
liyinuo20174 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范
艺术家天选4 小时前
STM32点亮LED灯
stm32·单片机·嵌入式硬件
向阳逐梦4 小时前
基于STM32F4单片机实现ROS机器人主板
stm32·单片机·机器人
委员5 小时前
基于NodeMCU的物联网空调控制系统设计
单片机·mcu·物联网·智能家居