generated from hulk/gd32e23x_template_cmake_vscode
35 lines
905 B
C
35 lines
905 B
C
#include "uart_ring_buffer.h"
|
|
|
|
static volatile uint8_t uart_rx_buffer[UART_RX_BUFFER_SIZE];
|
|
static volatile uint16_t uart_rx_write = 0;
|
|
static volatile uint16_t uart_rx_read = 0;
|
|
|
|
void uart_ring_buffer_init(void) {
|
|
uart_rx_write = 0;
|
|
uart_rx_read = 0;
|
|
}
|
|
|
|
uint16_t uart_rx_available(void) {
|
|
return (uart_rx_write + UART_RX_BUFFER_SIZE - uart_rx_read) % UART_RX_BUFFER_SIZE;
|
|
}
|
|
|
|
int uart_rx_get(void) {
|
|
if (uart_rx_read == uart_rx_write) return -1; // 空
|
|
uint8_t data = uart_rx_buffer[uart_rx_read];
|
|
uart_rx_read = (uart_rx_read + 1) % UART_RX_BUFFER_SIZE;
|
|
return data;
|
|
}
|
|
|
|
void uart_rx_put(uint8_t data) {
|
|
uint16_t next = (uart_rx_write + 1) % UART_RX_BUFFER_SIZE;
|
|
if (next != uart_rx_read) { // 缓冲区未满
|
|
uart_rx_buffer[uart_rx_write] = data;
|
|
uart_rx_write = next;
|
|
}
|
|
}
|
|
|
|
void uart_rx_clear(void) {
|
|
uart_rx_write = 0;
|
|
uart_rx_read = 0;
|
|
}
|