|
2 | 2 | [](https://github.com/netube99/RingBuffer) [](https://github.com/netube99/RingBuffer/blob/main/LICENSE) []()
|
3 | 3 |
|
4 | 4 | ## 简介
|
5 |
| -RingBuffer 是一个基于C语言开发的轻量级环形缓冲区,适用于各嵌入式平台的串口收发等应用场景;库文件提供了基础的环形数据读写功能,为了方便多组数据同时储存,RingBuffer提供了一个可选的分段记录功能;代码在GD32F130C8T6平台上编译运行,已进行过大量数据的串口收发压力测试,暂未发现显性BUG但不保证稳定性,用于产品开发的话请务必谨慎测试,如果发现BUG请及时反馈,谢谢; |
| 5 | +RingBuffer 是一个基于C语言开发的轻量级环形缓冲区,适用于各嵌入式平台的串口收发等应用场景;在基本功能的基础上还提供了一个分段记录框架,使得数据管理更加方便;代码在AT32F403A平台上编译运行,经过简单的串口收发测试后暂未发现显性BUG但不保证稳定性,用于产品开发的话请务必谨慎测试,如果发现BUG请及时反馈,谢谢; |
6 | 6 |
|
7 | 7 | ## 开始
|
8 |
| -1. 复制库文件至工程中,在源代码中引用 RingBuffer 头文件; |
9 |
| -2. 新建一个 uint8_t 数组,数组的大小即是环形缓冲区的大小; |
10 |
| -3. 新建 RingBuffer 操作句柄; |
11 |
| -4. 初始化 RingBuffer 操作句柄,将其与刚才新建的数组空间绑定,转换成环形缓冲区; |
12 |
| -5. 使用库提供的各种函数对新建的缓冲区进行读写等操作; |
13 |
| - |
14 |
| -## 示例 |
15 |
| -RingBuffer 的基本的使用方法 |
| 8 | +### 基础功能 RingBuffer Base 的使用方法 |
| 9 | + |
16 | 10 | ```c
|
| 11 | +//引用相关头文件 |
| 12 | +#include <stdint.h> |
17 | 13 | #include <stdio.h>
|
18 |
| -#include <ring_buffer.h> |
| 14 | +#include "ring_buffer.h" |
| 15 | + |
| 16 | +//创建一个数组作为数据存储空间 |
| 17 | +#define BUFFER_SIZE 128 |
| 18 | +static uint8_t buffer[BUFFER_SIZE]; |
19 | 19 |
|
20 |
| -#define READ_BUFFER_SIZE 256 |
| 20 | +//创建环形缓冲区句柄 |
| 21 | +static ring_buffer rb; |
21 | 22 |
|
22 |
| -int main() |
| 23 | +int main(void) |
23 | 24 | {
|
24 |
| - //新建缓冲区数组与RingBuffer操作句柄 |
25 |
| - uint8_t buffer[READ_BUFFER_SIZE] ; |
26 |
| - ring_buffer RB ; |
27 |
| - |
28 |
| - //初始化RingBuffer操作句柄,绑定缓冲区数组; |
29 |
| - RB_Init(&RB, buffer, READ_BUFFER_SIZE); |
30 |
| - |
31 |
| - //向环形缓冲区写入一段字节和一个字节 |
32 |
| - RB_Write_String(&RB, "hello world", 11); |
33 |
| - RB_Write_Byte(&RB, '!'); |
34 |
| - |
35 |
| - //获取已储存的数据长度,读出环形缓冲区中的数据并打印 |
36 |
| - uint32_t num = RB_Get_Length(&RB); |
37 |
| - uint8_t get[16] ; |
38 |
| - RB_Read_String(&RB, get, num); |
| 25 | + //初始化环形缓冲区参数 |
| 26 | + RB_Init(&rb, buffer, BUFFER_SIZE); |
| 27 | + |
| 28 | + //写入向环形缓冲区写入数据 |
| 29 | + RB_Write_String(&rb, "hello world", 11); |
| 30 | + RB_Write_Byte(&rb, '!'); |
| 31 | + RB_Write_Byte(&rb, 0x00); |
| 32 | + |
| 33 | + //删除环形缓冲区部分数据 |
| 34 | + RB_Delete(&rb, 2); |
| 35 | + |
| 36 | + //获取已储存的数据长度 |
| 37 | + uint32_t num = RB_Get_Length(&rb); |
| 38 | + |
| 39 | + //读出环形缓冲区中的数据并打印 |
| 40 | + uint8_t get[16]; |
| 41 | + RB_Read_String(&rb, get, num); |
39 | 42 | printf("%s", get);
|
40 | 43 |
|
41 |
| - return 0 ; |
| 44 | + //控制台输出内容 |
| 45 | + //llo world! |
| 46 | + return 0; |
| 47 | +} |
| 48 | +``` |
| 49 | +### 分段框架 RingBuffer Chapter 的使用方法 |
| 50 | +
|
| 51 | +```c |
| 52 | +//引用相关头文件 |
| 53 | +#include <stdint.h> |
| 54 | +#include <stdio.h> |
| 55 | +#include "ring_buffer_chapter.h" |
| 56 | +
|
| 57 | +//创建两个数组,一个作为数据存储空间,一个用于记录分段信息 |
| 58 | +#define BASE_SIZE 128 |
| 59 | +static uint8_t buffer_base[BASE_SIZE]; |
| 60 | +#define CHAPTER_SIZE 16 |
| 61 | +static uint32_t buffer_chapter[CHAPTER_SIZE]; |
| 62 | +
|
| 63 | +//创建分段环形缓冲区句柄 |
| 64 | +static ring_buffer_chapter rbc; |
| 65 | +
|
| 66 | +int main(void) |
| 67 | +{ |
| 68 | + //初始化分段环形缓冲区参数 |
| 69 | + RBC_Init(&rbc, buffer_base, BASE_SIZE, buffer_chapter, CHAPTER_SIZE); |
| 70 | +
|
| 71 | + //写入向环形缓冲区写入数据1,并记录分段结尾 |
| 72 | + RBC_Write_String(&rbc, "string1", 7); |
| 73 | + RBC_Write_Byte(&rbc, '!'); |
| 74 | + RBC_Write_Byte(&rbc, 0x00); |
| 75 | + RBC_Ending_Chapter(&rbc); |
| 76 | +
|
| 77 | + //写入向环形缓冲区写入数据2,并记录分段结尾 |
| 78 | + RBC_Write_String(&rbc, "string2", 7); |
| 79 | + RBC_Write_Byte(&rbc, '!'); |
| 80 | + RBC_Write_Byte(&rbc, 0x00); |
| 81 | + RBC_Ending_Chapter(&rbc); |
| 82 | +
|
| 83 | + //获取已储存的分段数量 |
| 84 | + uint32_t num = RBC_Get_Chapter_Number(&rbc); |
| 85 | +
|
| 86 | + //读出环形缓冲区中的数据并打印 |
| 87 | + uint8_t get[16]; |
| 88 | + for (uint32_t i = 0; i < num; i++) |
| 89 | + { |
| 90 | + RBC_Read_Chapter(&rbc, get, NULL); |
| 91 | + printf("%s\r\n", get); |
| 92 | + } |
| 93 | + |
| 94 | + //控制台输出内容 |
| 95 | + //string1! |
| 96 | + //string2! |
| 97 | + return 0; |
42 | 98 | }
|
43 | 99 | ```
|
| 100 | + |
44 | 101 | ## 更新
|
45 |
| -2021.01.19 v1.0.0 发布第一版本<br> |
46 |
| -2021.01.24 v1.1.0 增加匹配字符查找函数<br> |
47 |
| -2021.01.27 v1.2.0 重制匹配字符查找函数,现已支持8位到32位关键词查询<br> |
48 |
| -2021.01.28 v1.3.0 复位函数修改为删除函数、增加关键词插入函数(自适应大小端)<br> |
49 |
| -2021.01.30 v1.3.1 修复了String读写函数的小概率指针溢出错误<br> |
50 |
| -2021.06.29 v1.3.2 修复了 RB_Write_String 的参数类型错误,修复了RB_Write_Byte 无法写数组最后一位的问题<br> |
51 |
| -2022.05.31 v1.4.0 删除了关键词插入/查询功能,并使用分段结束记录功能替换;修改函数RB_Read_Byte的输出方式<br> |
| 102 | + |
| 103 | +2021.01.19 v0.1.0 第一版<br> |
| 104 | +2021.01.24 v0.1.0 增加匹配字符查找函数<br> |
| 105 | +2021.01.27 v0.2.0 重制匹配字符查找函数,现已支持8位到32位关键词查询<br> |
| 106 | +2021.01.28 v0.3.0 复位函数修改为删除函数、增加关键词插入函数(自适应大小端)<br> |
| 107 | +2021.01.30 v0.3.1 修复了String读写函数的小概率指针溢出错误<br> |
| 108 | +2021.06.29 v0.3.2 修复了 RB_Write_String 的参数类型错误,修复了RB_Write_Byte 无法写数组最后一位的问题<br> |
| 109 | +2022.08.20 v0.3.3 删除了关键词功能,使用分段结束记录功能替换;修改函数RB_Read_Byte的输出方式<br>2022.09.25 v0.4.0 删除旧版分段,重新开发分段记录框架功能<br> |
0 commit comments