环形缓冲区(单片机)

内容为 'Jojo'编写,日常学习总结,内容如有不足、不妥之处请私信告知,谢谢!

环形缓冲区的概念

百度:环形缓冲区

环形缓冲区说白点就是个数组,用途很多,在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据 。

环形缓冲区初始化

环形缓冲区写进数据

 

环形缓冲区读出数据

  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
环形缓冲区是一种常用的数据缓存方式,可以在单片机控制器中实现。下面给出一个简单的实现方式: 1. 定义缓冲区结构体 首先需要定义一个结构体来表示环形缓冲区,包含以下几个成员: - buffer:一个数组,用来存储数据 - head:缓冲区头指针,指向下一个要写入的位置 - tail:缓冲区尾指针,指向下一个要读取的位置 - size:缓冲区大小,即数组长度 ``` typedef struct { uint8_t buffer[BUF_SIZE]; uint8_t *head; uint8_t *tail; uint16_t size; } ring_buffer_t; ``` 2. 初始化缓冲区 在使用缓冲区之前需要对其进行初始化,将头指针和尾指针都指向缓冲区开头。 ``` void ring_buffer_init(ring_buffer_t *buffer, uint16_t size) { buffer->head = buffer->buffer; buffer->tail = buffer->buffer; buffer->size = size; } ``` 3. 向缓冲区写入数据 在向缓冲区写入数据时,需要判断缓冲区是否已满。如果已满,则不再写入数据,返回错误;否则将数据写入缓冲区,并更新头指针。 ``` int ring_buffer_write(ring_buffer_t *buffer, uint8_t data) { uint8_t *next_head = buffer->head + 1; if (next_head >= buffer->buffer + buffer->size) { next_head = buffer->buffer; } if (next_head == buffer->tail) { // buffer full return -1; } *(buffer->head) = data; buffer->head = next_head; return 0; } ``` 4. 从缓冲区读取数据 在从缓冲区读取数据时,需要判断缓冲区是否为空。如果为空,则不再读取数据,返回错误;否则将数据从缓冲区中读取,并更新尾指针。 ``` int ring_buffer_read(ring_buffer_t *buffer, uint8_t *data) { if (buffer->head == buffer->tail) { // buffer empty return -1; } *data = *(buffer->tail); uint8_t *next_tail = buffer->tail + 1; if (next_tail >= buffer->buffer + buffer->size) { next_tail = buffer->buffer; } buffer->tail = next_tail; return 0; } ``` 这样就可以实现一个简单的环形缓冲区了。当缓冲区满时,写入操作会失败;当缓冲区为空时,读取操作会失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值