#define UART_MAX_REV_SIZE 64 /* 串口接收最大缓存 */
#define UART_MAX_REV_NUM 2 /* 接收FIFO最大缓存信息条数 */
typedef struct
{
uint8_t data[UART_MAX_REV_NUM][UART_MAX_REV_SIZE]; /* 串口接收数据 */
uint8_t data_size[UART_MAX_REV_NUM];/* 接收数据长度 */
uint8_t write_index;/* FIFO写入缓存位置 */
uint8_t read_index;/* FIFO读出缓存位置 */
uint8_t fifo_data_num;/* FIFO中数据条数 */
}uart_rev_fifo_t;
static uart_rev_fifo_t uart_rev_fifo =
{
.read_index = 0,
.write_index = 0,
.fifo_data_num = 0,
};
void fifo_init(void)
{
memset(&uart_rev_fifo , 0, sizeof(uart_rev_fifo));
}
/**
* @brief 串口接收回调
* @note 将数据放入FIFO;如数据超长,丢弃超出部分;如缓存已满,从最早的一条数据开始覆盖
* @param rx_data 接收数据
* @param size 长度
*/
static void _uart_rx_hander_cb(uint8_t *rx_data, uint32_t size)
{
if(size > UART_MAX_REV_NUM) //超出长度数据丢弃
size = UART_MAX_REV_NUM;
memcpy(uart_rev_fifo.data[uart_rev_fifo.write_index], rx_data, size);
uart_rev_fifo.data_size[uart_rev_fifo.write_index] = size;
if(uart_rev_fifo.fifo_data_num < UART_MAX_REV_NUM)
uart_rev_fifo.fifo_data_num++;//缓存数据量累加
uart_rev_fifo.write_index++;//指向下一缓存空间
if(uart_rev_fifo.write_index >= UART_MAX_REV_NUM)//最后一个空间已满后,从头开始存放
{
uart_rev_fifo.write_index = 0;
}
}
/**
* @brief 串口接收数据循环处理
* @note FIFO数据取出
*/
void app_uart_rev_data_loop_deal(void)
{
if(uart_rev_fifo.fifo_data_num)//判断fifo中有数据
{
rev_data_handle(uart_rev_fifo.data[uart_rev_fifo.read_index],uart_rev_fifo.data_size[uart_rev_fifo.read_index]);
uart_rev_fifo.fifo_data_num--;//减少一条fifo数据
uart_rev_fifo.read_index++;//读取位置加1
if(hci_uart_rev_fifo.read_index == UART_MAX_REV_NUM)//从头开始读出
hci_uart_rev_fifo.read_index = 0;
}
}
使用注意:此fifo放入和取出时未清理fifo中的残留数据。所以如有判满需求,应使用 uart_rev_fifo.fifo_data_num判定fifo是否已满,或自行对残余数据或数据长度进行清理。