#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,最终验证代码正确。