#include#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("nr"); } } 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("%hhunr", Result); Ring_Queue.Head++; if (Ring_Queue.Head == Ring_Queue.Buffer + Len) { Ring_Queue.Head = Ring_Queue.Buffer; } } printf("nr"); } void Key_Input() { printf("输入数据:nr"); for (unsigned char Scanf_Num = 0; Scanf_Num < 6; Scanf_Num++) { scanf_s(" %hhu", &Input_Buff[Scanf_Num]); //注意%hhu前的空格 } printf("输入长度:nr"); scanf_s("%hhu", &Input_Num); printf("读取长度:nr"); 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,最终验证代码正确。



