循环缓冲区结构体格式
#define RX_BUF_SIZE 128
typedef struct
{
u8 count; //缓冲区buf 变量中放进数据之后当前可以取出来的个数,
u8 head; //缓冲区buf此时下一个要放进去的索引index 下标,
u8 tail; //缓冲区buf 中获取数据的索引index下标
u8 buf[RX_BUF_SIZE]; //换缓冲区
}RXQUE_USART;
RXQUE_USART RxQue_Usart1;
缓冲区可以跨越多个区域放置一个数据,也可以跨越多个区域取出一个数据,方式就是防止越界。如果越界如何定位准确的buf 索引index 的下标,要防止buff 越界需要遵循以下逻辑算数规则。
放置一个字节原则算法:此处是一个一个的放置;(有待改进)
RxQue_Usart1.buf[RxQue_Usart1.head] = (u8)USART1->DR; RxQue_Usart1.head++; if(RxQue_Usart1.head >= RX_BUF_SIZE) { RxQue_Usart1.head = 0; } RxQue_Usart1.count++;
取出一个字节原则算法:此处是一个一个的取出;(有待改进)
*pbuf = RxQue_Usart1.buf[RxQue_Usart1.tail++]; RxQue_Usart1.tail = (RxQue_Usart1.tail >= RX_BUF_SIZE)?0:RxQue_Usart1.tail; RxQue_Usart1.count--;
跨越取一个字节的原则算法:(防止越界)<例如跨越3个byte>
RxQue_Usart1.buf[ ((RxQue_Usart1.tail+3)%(RX_BUF_SIZE-1))-((RxQue_Usart1.tail+3)/(RX_BUF_SIZE-1)) ]