#include <stdio.h>
#define Len 6
unsigned char Input_Buff[6] = {0}; //用户输入缓冲区
unsigned char Input_Num = 0; //输入队列数据字节数
unsigned char Output_Num = 0; //从队列取出的数据字节数
struct Queue
{
unsigned char Buffer[Len];
unsigned char* Head;
unsigned char* Tail;
};
Queue Ring_Queue;
void Empty() { //清空队列
Ring_Queue.Head = Ring_Queue.Buffer;//Buffer缓冲区数组
Ring_Queue.Tail = Ring_Queue.Buffer;
}
void Write(unsigned char* pData, unsigned char Data_Len) { //入队列
for (unsigned char Data_Num = 0; Data_Num < Data_Len; Data_Num++) {
Ring_Queue.Buffer[Ring_Queue.Tail - Ring_Queue.Buffer] = *pData;
pData++;
Ring_Queue.Tail++; //尾指针指向写入数据的末端
if (Ring_Queue.Tail == Ring_Queue.Buffer + Len) {
Ring_Queue.Tail = Ring_Queue.Buffer;
}
if (Ring_Queue.Head == Ring_Queue.Tail) { //不覆盖旧数据
return;
}
printf("\n\r");
}
}
void Read(unsigned char Read_Len) { //从队列中取出
unsigned char Result = 0;
for (unsigned char Read_Num = 0; Read_Num < Read_Len; Read_Num++) {
Result = *(Ring_Queue.Head); //头指针指向读出数据后队列中剩余数据的开头
*(Ring_Queue.Head) = NULL;
printf("%hhu\n\r", Result);
Ring_Queue.Head++;
if (Ring_Queue.Head == Ring_Queue.Buffer + Len) {
Ring_Queue.Head = Ring_Queue.Buffer;
}
}
printf("\n\r");
}
void Key_Input() {
printf("输入数据:\n\r");
for (unsigned char Scanf_Num = 0; Scanf_Num < 6; Scanf_Num++) {
scanf_s(" %hhu", &Input_Buff[Scanf_Num]); //注意%hhu前的空格
}
printf("输入长度:\n\r");
scanf_s("%hhu", &Input_Num);
printf("读取长度:\n\r");
scanf_s("%hhu", &Output_Num);
}
int main() {
Empty();
while (1) {
Key_Input();
Write(Input_Buff, Input_Num);
Read(Output_Num);
}
return 0;
}
验证效果 输入4个数字(这里必须输入六个数字后截取前四个,暂时没想到很好的解决办法),取出3个,再输入5个,全部取出,观察是否没有覆盖旧数据。
可以看到第一次输入的1 2 3 4 ,取出的是1 2 3,此时队列中还剩4 ,写入 9 8 7 6 5 后,由于不覆盖旧数据,因此队列中应该是4 9 8 7 6 5,最终验证代码正确。