-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathringbuffer.c
More file actions
103 lines (95 loc) · 2.44 KB
/
Copy pathringbuffer.c
File metadata and controls
103 lines (95 loc) · 2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "ringbuffer.h"
// 初始化环形缓冲区
void ringbuffer_init(ringbuffer_t *rb)
{
// 设置读指针和写指针初始值为0
rb->r = 0;
rb->w = 0;
// 将缓冲区内存清零
memset(rb->buffer, 0, sizeof(uint8_t) * RINGBUFFER_SIZE);
// 初始化项目计数为0
rb->itemCount = 0;
}
// 检查环形缓冲区是否已满
uint8_t ringbuffer_is_full(ringbuffer_t *rb)
{
// 如果项目计数等于缓冲区大小,返回1(已满),否则返回0(未满)
return (rb->itemCount == RINGBUFFER_SIZE);
}
// 检查环形缓冲区是否为空
uint8_t ringbuffer_is_empty(ringbuffer_t *rb)
{
// 如果项目计数为0,返回1(为空),否则返回0(非空)
return (rb->itemCount == 0);
}
int8_t ringbuffer_peek_one(ringbuffer_t *rb, uint8_t *out) {
if (ringbuffer_is_empty(rb)) {
return -1;
}
// ???? r ???????
uint32_t idx = rb->r % RINGBUFFER_SIZE;
*out = rb->buffer[idx];
return 0;
}
/**
* @brief ?????????
*
* @param c ??????
* @return true ??(?????,*c ???)
* @return false ????
*/
bool rb_peek(char *c) {
uint8_t tmp;
// ringbuffer_peek_one ?? 0 ????
if (ringbuffer_peek_one(&usart_rb, &tmp) == 0) {
*c = (char)tmp;
return true;
}
return false;
}
/**
* @brief ????????
*
* @param c ??????
* @return true ??(?????,*c ??????)
* @return false ????
*/
bool rb_get(char *c) {
uint8_t tmp;
// ringbuffer_read ?? 0 ????????????
if (ringbuffer_read(&usart_rb, &tmp, 1) == 0) {
*c = (char)tmp;
return true;
}
return false;
}
// 向环形缓冲区写入数据
int8_t ringbuffer_write(ringbuffer_t *rb, uint8_t *data, uint32_t num)
{
// 如果缓冲区已满,返回-1
if(ringbuffer_is_full(rb))
return -1;
// 将数据写入缓冲区
while(num--)
{
rb->buffer[rb->w] = *data++; // 写入数据并移动写指针
rb->w = (rb->w + 1) % RINGBUFFER_SIZE; // 写指针循环递增
rb->itemCount++; // 增加项目计数
}
return 0; // 写入成功返回0
}
// 从环形缓冲区读取数据
int8_t ringbuffer_read(ringbuffer_t *rb, uint8_t *data, uint32_t num)
{
// 如果缓冲区为空,返回-1
if(ringbuffer_is_empty(rb))
return -1;
// 从缓冲区读取数据
while(num--)
{
*data++ = rb->buffer[rb->r]; // 读取数据并移动读指针
rb->r = (rb->r + 1) % RINGBUFFER_SIZE; // 读指针循环递增
rb->itemCount--; // 减少项目计数
}
return 0; // 读取成功返回0
}