#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(); }