Kaynağa Gözat

读取一串数据

xuxinyi 1 ay önce
ebeveyn
işleme
a01416cb42
3 değiştirilmiş dosya ile 52 ekleme ve 5 silme
  1. 4 2
      Core/Inc/ring_buffer.h
  2. 43 0
      Core/Src/main.c
  3. 5 3
      Core/Src/ring_buffer.c

+ 4 - 2
Core/Inc/ring_buffer.h

@@ -7,11 +7,13 @@
 
 
 #include <stdint.h>
+#include "string.h"
 
 #define QUEUE_SIZE 10   // 队列大小,可以根据需求调整
+#define BL_DATA_SIZE 8   //存储一组蓝牙数据
 
 typedef struct {
-    uint8_t buffer[QUEUE_SIZE];
+    uint8_t buffer[QUEUE_SIZE][BL_DATA_SIZE];
     volatile uint16_t head;  // 读指针
     volatile uint16_t tail;  // 写指针
 } RingBuffer;
@@ -26,7 +28,7 @@ int  RingBuffer_IsEmpty(RingBuffer *q);
 int  RingBuffer_IsFull(RingBuffer *q);
 
 // 入队
-int  RingBuffer_Enqueue(RingBuffer *q, uint8_t data);
+int  RingBuffer_Enqueue(RingBuffer *q, uint8_t *data);
 
 // 出队
 int  RingBuffer_Dequeue(RingBuffer *q, uint8_t *data);

+ 43 - 0
Core/Src/main.c

@@ -263,6 +263,49 @@ int main(void)
 
   powerOn();
   E52_CtlPowerOn_Fun();
+  RingBuffer q;
+  RingBuffer_Init(&q);
+
+  uint8_t data_in[BL_DATA_SIZE];
+  uint8_t data_out[BL_DATA_SIZE];
+
+  printf("=== 环形队列循环入队/出队测试开始 ===\n");
+
+  // 循环 20 次,模拟不断写入和读取
+  for (int n = 0; n < 20; n++) {
+    // 准备一组数据(内容累加)
+    for (int i = 0; i < BL_DATA_SIZE; i++) {
+      data_in[i] = (n << 4) + (i + 1);  // 每轮累加 0x10
+    }
+
+
+    // 入队
+    if (RingBuffer_Enqueue(&q, data_in) == 0) {
+      printf("[%02d] 入队成功: ", n);
+      for (int i = 0; i < BL_DATA_SIZE; i++) {
+        printf("%d ", data_in[i]);
+      }
+      printf("\n");
+    } else {
+      printf("[%02d] 入队失败: 队列已满\n", n);
+    }
+
+    // 出队
+    if (RingBuffer_Dequeue(&q, data_out) == 0) {
+      printf("[%02d] 出队成功: ", n);
+      for (int i = 0; i < BL_DATA_SIZE; i++) {
+        printf("%d ", data_out[i]);
+      }
+      printf("\n");
+    } else {
+      printf("[%02d] 出队失败: 队列为空\n", n);
+    }
+    printf("=== 下一轮测试 ===\n");
+  }
+
+  printf("=== 测试结束 ===\n");
+
+  while (TRUE);
 
 
   // 启动 USART2 DMA 接收

+ 5 - 3
Core/Src/ring_buffer.c

@@ -17,11 +17,12 @@ int RingBuffer_IsFull(RingBuffer *q) {
     return ((q->tail + 1) % QUEUE_SIZE == q->head);
 }
 
-int RingBuffer_Enqueue(RingBuffer *q, uint8_t data) {
+int RingBuffer_Enqueue(RingBuffer *q, uint8_t *data) {
     if (RingBuffer_IsFull(q)) {
         return -1;  // 队列已满
     }
-    q->buffer[q->tail] = data;
+    // q->buffer[q->tail] = data;
+    memcpy(q->buffer[q->tail], data, BL_DATA_SIZE);
     q->tail = (q->tail + 1) % QUEUE_SIZE;
     return 0;
 }
@@ -30,7 +31,8 @@ int RingBuffer_Dequeue(RingBuffer *q, uint8_t *data) {
     if (RingBuffer_IsEmpty(q)) {
         return -1;  // 队列为空·
     }
-    *data = q->buffer[q->head];
+    // *data = q->buffer[q->head];
+    memcpy(data,q->buffer[q->head], BL_DATA_SIZE);
     q->head = (q->head + 1) % QUEUE_SIZE;
     return 0;
 }