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
- #include
- #include
- #include
- #include
- #include
- #include
-
- /********************************************************
- 函数名: 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;
- }
-
-
-