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;
}
相关推荐
xyx-3v1 小时前
SPI四种工作模式
stm32·单片机·嵌入式硬件·学习
qiuiuiu4131 小时前
正点原子RK3568学习日志6-驱动模块传参
linux·c语言·开发语言·单片机·学习
BreezeJuvenile2 小时前
实验二 呼吸灯功能实验
stm32·单片机·嵌入式系统·流水灯·实验
北京阿尔泰科技厂家5 小时前
CPCIe-76F1G控制器:国产化高性能嵌入式解决方案
嵌入式硬件·控制器·工业自动化·数据采集卡·国产化控制器
Truffle7电子5 小时前
STM32【H7】理论——通信
stm32·单片机·嵌入式硬件
zhonghaoxincekj5 小时前
晶体管的定义,晶体管测量参数和参数测量仪器
功能测试·单片机·学习·测试工具·单元测试·制造
MAR-Sky5 小时前
keil5使用STlink下载程序到stm32后不自动运行的解决办法
stm32·单片机·嵌入式硬件
Blossom.1186 小时前
把AI“浓缩”到1KB:超紧凑型决策树在MCU上的极限优化实战
人工智能·python·单片机·深度学习·决策树·机器学习·数据挖掘
深圳市青牛科技实业有限公司7 小时前
在电力系统、电子设备制造等领域,变压器测试感量,电桥内阻如何选择
嵌入式硬件·音视频·制造·立体声收录机·盒式录音机·电子烟
充哥单片机设计9 小时前
【STM32项目开源】基于STM32的智能厨房环境监控系统
stm32·单片机·嵌入式硬件