// 完整示例代码
#include "stm32f1xx_hal.h"

#define BUF_SIZE 256

typedef struct {
    uint8_t data[BUF_SIZE];
    volatile uint16_t read_ptr;
    volatile uint16_t write_ptr;
    volatile uint8_t half_flag;
} RingBuffer;

RingBuffer ring_buf;
uint8_t user_buffer[BUF_SIZE];

void UART_RX_Init(void);
void UART_IDLE_Callback(void);
void DMA_Half_Callback(void);
void Process_RX_Data(void);
void User_RX_Callback(uint8_t *data, uint16_t len);

void UART_RX_Init(void)
{
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
    HAL_UART_Receive_DMA(&huart1, ring_buf.data, BUF_SIZE);
    HAL_DMA_Start_IT(&hdma_uart_rx, (uint32_t)&huart1.Instance->RDR,
                     (uint32_t)ring_buf.data, BUF_SIZE);
}

void UART_IDLE_Callback(void)
{
    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    ring_buf.write_ptr = BUF_SIZE - __HAL_DMA_GET_COUNTER(&hdma_uart_rx);
    Process_RX_Data();
}

void DMA_Half_Callback(void)
{
    ring_buf.half_flag = 1;
    ring_buf.write_ptr = BUF_SIZE / 2;
}

void Process_RX_Data(void)
{
    uint16_t data_len;
    if (ring_buf.write_ptr >= ring_buf.read_ptr) {
        data_len = ring_buf.write_ptr - ring_buf.read_ptr;
    } else {
        data_len = BUF_SIZE - ring_buf.read_ptr + ring_buf.write_ptr;
    }
    if (data_len == 0) return;

    uint16_t first_len = (data_len > (BUF_SIZE - ring_buf.read_ptr)) ?
                         (BUF_SIZE - ring_buf.read_ptr) : data_len;
    memcpy(user_buffer, &ring_buf.data[ring_buf.read_ptr], first_len);
    uint16_t second_len = data_len - first_len;
    if (second_len > 0) {
        memcpy(user_buffer + first_len, ring_buf.data, second_len);
    }
    ring_buf.read_ptr = (ring_buf.read_ptr + data_len) % BUF_SIZE;
    if (ring_buf.half_flag && (ring_buf.read_ptr == ring_buf.write_ptr)) {
        ring_buf.half_flag = 0;
    }
    User_RX_Callback(user_buffer, data_len);
}

void User_RX_Callback(uint8_t *data, uint16_t len)
{
    // 用户处理数据
}