⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r_buf.c

📁 自己写的一个用在单片机串口通讯中的环形队列缓冲区管理模块。
💻 C
字号:
///////////////////////////////////////////////////////////////////////////////
 // R_buf.c
 // Xie Jingbo
 // V1.2
 // 2005-9-7
 // Ring queue buffer operation program.Independence platform.
///////////////////////////////////////////////////////////////////////////////
#include "r_buf.h"
#include "..\device\driver.h"

///----------------------------------------------------------------------------
 // Ring buffer init functin.
///----------------------------------------------------------------------------
bool RbInit(pR_buf rb, uchar *pBuf, uint bLen)
{
	if (rb == NULL || pBuf == NULL || bLen < 1)
	{
		return FALSE;
	}

	OS_DISABLE_INT();					//Close all interrupt
	rb->head = 0;
	rb->end = 0;
	rb->buf = pBuf;
	rb->RbLen = bLen;
	OS_ENABLE_INT();					//Open all interrupt

	return TRUE;
}

///----------------------------------------------------------------------------
 // Ring buffer reinit functin.
///----------------------------------------------------------------------------
bool RbReinit(pR_buf rb)
{
	if (rb == NULL)
	{
		return FALSE;
	}

	OS_DISABLE_INT();
	rb->head = 0;
	rb->end = 0;
	OS_ENABLE_INT();

	return TRUE;
}

///----------------------------------------------------------------------------
 // Insert one data to ring buf.
///----------------------------------------------------------------------------
bool RbPush(pR_buf rb, uchar val)
{
	if (RbFull(rb))
	{
		return FALSE;
	}
	
	OS_DISABLE_INT();
	rb->buf[rb->head] = val;
	rb->head = (rb->head + 1) % rb->RbLen;
	OS_ENABLE_INT();

	return TRUE;
}

///----------------------------------------------------------------------------
 // Remove one data from ring buf.
///----------------------------------------------------------------------------
bool RbPop(pR_buf rb, uchar *val)
{
	if (RbEmpty(rb))
	{
		return FALSE;
	}
	
	OS_DISABLE_INT();
	*val = rb->buf[rb->end];
	rb->end = (rb->end + 1) % rb->RbLen;
	OS_ENABLE_INT();

	return TRUE;
}

///----------------------------------------------------------------------------
 // Insert some data to ring buf.
///----------------------------------------------------------------------------
bool RbInsrt(pR_buf rb, uchar *in, int inLen)
{
	if (rb == NULL || in == NULL || inLen > RbGetFree(rb))
	{
		return FALSE;
	}

	OS_DISABLE_INT();
	while(inLen--)
	{
		rb->buf[rb->head] = *in++;
		rb->head = (rb->head + 1) % rb->RbLen;
	}
	OS_ENABLE_INT();

	return TRUE;
}

///----------------------------------------------------------------------------
 // Remove some data from ring buf.
///----------------------------------------------------------------------------
bool RbRemove(pR_buf rb, uchar *out, int outLen)
{
	if (rb == NULL || out == NULL || outLen > RbGetDatLen(rb))
	{
		return FALSE;
	}
	
	OS_DISABLE_INT();
	while(outLen--)
	{
		*out++ = rb->buf[rb->head];
		rb->end = (rb->end + 1) % rb->RbLen;
	}
	OS_ENABLE_INT();

	return TRUE;
}

///----------------------------------------------------------------------------
 // Search one char from ring buf.
///----------------------------------------------------------------------------
int RbSearch(pR_buf rb, uchar ch, bool newSearch)
{
	static uint t_end = 0;
	
	if (rb == NULL)
	{
		return -1;
	}
	
	if (newSearch)
	{
		t_end = rb->end;
	}
	
	OS_DISABLE_INT();
	while((t_end != rb->head) && (rb->buf[t_end] != ch))
	{
		t_end = (t_end + 1) % rb->RbLen;
	}
	OS_ENABLE_INT();
	
	if (t_end == rb->head)
	{
		return -1;
	}

	return t_end;
}

///////////////////////////////////////////////////////////////////////////////
 // The end.
///////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -