一个单缓冲FIFO算法

#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是否已满,或自行对残余数据或数据长度进行清理。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值