generated from hulk/gd32e23x_template_cmake_vscode
59 lines
1.7 KiB
C
59 lines
1.7 KiB
C
#include "uart_ring_buffer.h"
|
||
|
||
// 环形缓冲区结构体定义(精简版)
|
||
struct uart_ring_buffer {
|
||
volatile uint8_t buffer[UART_RX_BUFFER_SIZE];
|
||
volatile uint8_t head; // 写指针
|
||
volatile uint8_t tail; // 读指针
|
||
};
|
||
|
||
static uart_ring_buffer_t uart_rx_buf = {0};
|
||
|
||
static void uart_ring_buffer_reset_state(void) {
|
||
uart_rx_buf.head = 0;
|
||
uart_rx_buf.tail = 0;
|
||
}
|
||
|
||
void uart_ring_buffer_init(void) {
|
||
uart_ring_buffer_reset_state();
|
||
}
|
||
|
||
uint8_t uart_ring_buffer_available(void) {
|
||
uint8_t h = uart_rx_buf.head;
|
||
uint8_t t = uart_rx_buf.tail;
|
||
return (uint8_t)((h + UART_RX_BUFFER_SIZE - t) % UART_RX_BUFFER_SIZE);
|
||
}
|
||
|
||
/**
|
||
* @brief 从UART环形缓冲区中获取一个数据
|
||
*
|
||
* @return int 成功返回获取到的8位数据,如果缓冲区为空则返回-1
|
||
*/
|
||
int uart_ring_buffer_get(void) {
|
||
// 检查环形缓冲区是否为空(tail与head相等表示缓冲区为空)
|
||
if (uart_rx_buf.tail == uart_rx_buf.head) return -1;
|
||
// 从缓冲区tail位置获取数据
|
||
uint8_t data = uart_rx_buf.buffer[uart_rx_buf.tail];
|
||
// 更新tail位置,实现环形缓冲区的循环使用
|
||
// 使用取模运算确保tail在缓冲区大小范围内循环
|
||
uart_rx_buf.tail = (uart_rx_buf.tail + 1) % UART_RX_BUFFER_SIZE;
|
||
// 返回获取到的数据
|
||
return data;
|
||
}
|
||
|
||
bool uart_ring_buffer_put(uint8_t data) {
|
||
uint8_t next = (uart_rx_buf.head + 1) % UART_RX_BUFFER_SIZE;
|
||
if (next != uart_rx_buf.tail) {
|
||
uart_rx_buf.buffer[uart_rx_buf.head] = data;
|
||
uart_rx_buf.head = next;
|
||
return true;
|
||
} else {
|
||
// 缓冲区满,静默丢弃新数据
|
||
return false;
|
||
}
|
||
}
|
||
|
||
void uart_ring_buffer_clear(void) {
|
||
uart_ring_buffer_reset_state();
|
||
}
|