C语言实现环形缓冲区

举报
yd_274589494 发表于 2023/07/26 12:13:17 2023/07/26
【摘要】 @TOC 前言本篇文章将为大家介绍一下什么是环形缓冲区,在很多场合都可以使用环形缓冲区,他既可以进行数据的写入也可以进行数据的读取,使用环形缓冲区可以减小数据丢失的风险,更加保证了数据的安全性和有效性。 一、什么是环形缓冲区?在通信程序中,经常使用环形缓冲器作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。 二、为什么要使用...

@TOC


前言

本篇文章将为大家介绍一下什么是环形缓冲区,在很多场合都可以使用环形缓冲区,他既可以进行数据的写入也可以进行数据的读取,使用环形缓冲区可以减小数据丢失的风险,更加保证了数据的安全性和有效性。

一、什么是环形缓冲区?

在通信程序中,经常使用环形缓冲器作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。

二、为什么要使用环形缓冲区及环形缓冲区实用场景

环形缓冲区说白了就是一个数组,这个数组里面能存储非常多的数据。使用环形缓冲区可以帮助我们保证数据的安全及数据的可靠性。
环形缓冲区可以用于各种信息的存放。

1.多次按下按键
有的设备性能不是很好,在多次操作按键后,可能就只有少数几次按键是有效的,因为设备无法快速读取这些按键值并且进行处理,我们可以将按键的数据一个个的存放进环形缓冲区,处理时再去一个个的取出这些就可以保证数据不会被丢失。

三、环形缓冲区原理及代码的编写

原理

环形缓冲区就是一个很大的数组,我们给他分配一个读指针和一个写指针。
在这里插入图片描述
当写入数据时W指向下一个数组的地址,R不变。
同样的道理当读取数据时R加加,W不变。
在这里插入图片描述
环形缓冲区为空的条件,W和R同时等于0。
环形缓冲区为满的条件,W+1等于环形缓冲区的大小。

代码编写

/*BUF_SIZE就是一个宏大小一般定义为128*/
static int Buf[BUF_SIZE]={0}; //缓冲区
static int W=0; //写指针
static int R=0; //读指针

/*环形缓冲区初始化*/
void Buff_Init(void)
{
	Buff_Clear(); 
}

/*写数据*/
void Buff_Write(int data)
{
	if((W+1)%BUF_SIZE!=R) //队列未满
	{
		Buf[W]=data;
		W=(W+1)%BUF_SIZE;
	}
}

/*读数据*/
int Buff_Read(void)
{
	int data=0;
	
	if(R!=W) //队列非空
	{
		data=Buf[R];
		R=(R+1)%BUF_SIZE;
	}
	return data;
}

/*环形缓冲区清0*/
void Buff_Clear(void)
{
	W=0;
	R=0;
}


总结

环形缓冲区在嵌入式开发中会经常使用到,我希望大家能够将这个知识点牢记于心。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。