• MCU的环形FIFO


    fifo.h

    1. #ifndef __FIFO_H
    2. #define __FIFO_H
    3. #include "main.h"
    4. #define RINGBUFF_LEN (500) //定义最大接收字节数 500
    5. typedef struct
    6. {
    7. uint16_t Head; // 头指针 指向可读起始地址 每读一个,数字+1
    8. uint16_t Tail; // 尾指针 指向可写的起始地址 每写一个,数字+1,当尾指针超过数组大小,
    9. // 则尾指针又指向数组首地址。
    10. uint16_t Lenght; // 长度
    11. uint8_t Ring_data[RINGBUFF_LEN]; // 数据缓冲区
    12. }RingBuff_t;
    13. uint16_t getRingBuffLenght(RingBuff_t *ringBuff); // 获取缓冲区长度
    14. void initRingBuff(RingBuff_t *ringBuff);
    15. void writeRingBuff(RingBuff_t *ringBuff,uint8_t data); // 写入对应数据
    16. void deleteRingBuff(RingBuff_t *ringBuff,uint16_t size); // 删除对应长度的数据
    17. uint8_t readRingBuff(RingBuff_t *ringBuff,uint16_t position); // 读取对应位的数据
    18. /* 使用示例
    19. 1.创建环形队列句柄
    20. RingBuff_t _ringBuff
    21. 2.初始化
    22. initRingBuff(&_ringBuff);
    23. 3.添加数据
    24. HAL_UART_Receive_IT(&huart2,&_RxBuff[0],1); // 打开串口中断
    25. writeRingBuff(&_ringBuff,tjc_RxBuff[0]);
    26. 4. 数据包解析
    27. #define FRAMELENGTH 6 // 数据包的长度
    28. void DataAnalysis()
    29. {
    30. while(getRingBuffLenght(&tjc_ringBuff) >= FRAMELENGTH) // 如果以及接收的数据长于数据包的长度
    31. {
    32. //校验帧头帧尾是否匹配
    33. if(readRingBuff(&tjc_ringBuff,0) != 0x55 ||readRingBuff(&tjc_ringBuff,4) != 0xff || readRingBuff(&tjc_ringBuff,5) != 0xff)
    34. {
    35. deleteRingBuff(&tjc_ringBuff,1); //不匹配删除1字节
    36. }else //匹配
    37. { // 数据处理 开始
    38. switch (readRingBuff(&tjc_ringBuff,1)) // 判断页面和控件
    39. {
    40. case 0x10: // 左右
    41. break;
    42. default:
    43. break;
    44. }// 数据处理 结束
    45. deleteRingBuff(&tjc_ringBuff,FRAMELENGTH); // 删除对应数据包的
    46. break;
    47. }
    48. }
    49. }
    50. */
    51. #endif

    fifo.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. /********************************************************
    9. 函数名: initRingBuff
    10. 功能: 初始化环形缓冲区
    11. 输入参数:
    12. 返回值: void
    13. 修改记录:
    14. **********************************************************/
    15. void initRingBuff(RingBuff_t *ringBuff)
    16. {
    17. //初始化相关信息
    18. ringBuff->Head = 0;
    19. ringBuff->Tail = 0;
    20. ringBuff->Lenght = 0;
    21. }
    22. /********************************************************
    23. 函数名: writeRingBuff
    24. 功能: 往环形缓冲区写入数据 每次写入一个数据
    25. **********************************************************/
    26. void writeRingBuff(RingBuff_t *ringBuff,uint8_t data)
    27. {
    28. if(ringBuff->Lenght >= RINGBUFF_LEN) //判断缓冲区是否已满
    29. {
    30. return ;
    31. }
    32. ringBuff->Ring_data[ringBuff->Tail]=data; //写入到尾数据
    33. ringBuff->Tail = (ringBuff->Tail+1)%RINGBUFF_LEN; //防止越界非法访问 Tail=RINGBUFF_LEN 就为0
    34. //如果Tail指针已经到达缓冲区的末尾,那么Tail+1就会变成0
    35. ringBuff->Lenght++;} // 数据长度+1
    36. /********************************************************
    37. 函数名: deleteRingBuff
    38. 功能: 删除串口缓冲区中相应长度的数据 从头删除指定长度
    39. 输入参数: 要删除的长度
    40. **********************************************************/
    41. void deleteRingBuff(RingBuff_t *ringBuff, uint16_t size)
    42. {
    43. if(size >= ringBuff->Lenght) // 确保小于以有数据
    44. {
    45. initRingBuff(ringBuff);
    46. return;
    47. }
    48. for(int i = 0; i < size; i++)
    49. {
    50. if(ringBuff->Lenght == 0)//判断非空
    51. {
    52. initRingBuff(ringBuff);
    53. return;
    54. }
    55. ringBuff->Head = (ringBuff->Head+1)%RINGBUFF_LEN;//防止越界非法访问
    56. ringBuff->Lenght--;
    57. }
    58. }
    59. /********************************************************
    60. 函数名: readRingBuff
    61. 功能: 从串口缓冲区读取1字节数据
    62. 输入参数: position:读取的位置
    63. 返回值: 所在位置的数据(1字节)
    64. **********************************************************/
    65. uint8_t readRingBuff(RingBuff_t *ringBuff, uint16_t position)
    66. {
    67. uint16_t realPosition = (ringBuff->Head + position) % RINGBUFF_LEN;
    68. return ringBuff->Ring_data[realPosition];
    69. }
    70. /********************************************************
    71. 函数名: getRingBuffLenght
    72. 功能: 获取串口缓冲区的数据数量
    73. 返回值: 串口缓冲区的数据数量
    74. **********************************************************/
    75. uint16_t getRingBuffLenght(RingBuff_t *ringBuff)
    76. {
    77. return ringBuff->Lenght;
    78. }
    79. /********************************************************
    80. 函数名: isRingBuffOverflow
    81. 功能: 判断环形缓冲区是否已满
    82. 返回值: 1:环形缓冲区已满 , 2:环形缓冲区未满
    83. **********************************************************/
    84. uint8_t isRingBuffOverflow(RingBuff_t *ringBuff)
    85. {
    86. return ringBuff->Lenght == RINGBUFF_LEN;
    87. }

  • 相关阅读:
    Digicert证书:您的网络安全守护神
    钉钉内嵌H5遇到的一些问题
    C语言基础Day7-结构体
    springboot反射执行private方法@Autowired字段为空
    系统架构设计师——计算机系统基础知识
    CF1720 --- Codeforces Round #815 (Div. 2)
    基于SSM的健达企业项目管理系统的设计与实现-计算机毕业设计
    ES6(ECMASript 6 新特性---Promise)
    【17-微服务网关之Spring Cloud Gateway&Spring Cloud Gateway网关服务搭建】
    字符串的方法
  • 原文地址:https://blog.csdn.net/JasonKyro/article/details/139550139