Quellcode durchsuchen

添加循环队列使用方法

xuxinyi vor 2 Monaten
Ursprung
Commit
ebdcab41da
5 geänderte Dateien mit 104 neuen und 1 gelöschten Zeilen
  1. 4 1
      CMakeLists.txt
  2. 34 0
      Core/Inc/ring_buffer.h
  3. 28 0
      Core/Src/main.c
  4. 36 0
      Core/Src/ring_buffer.c
  5. 2 0
      README.md

+ 4 - 1
CMakeLists.txt

@@ -38,7 +38,10 @@ add_executable(${CMAKE_PROJECT_NAME}
         Core/Src/E52.c
         Core/Inc/E52.h
         Core/Src/RTC_SLEEP.c
-        Core/Inc/RTC_SLEEP.h)
+        Core/Inc/RTC_SLEEP.h
+        Core/Src/ring_buffer.c
+        Core/Inc/ring_buffer.h
+)
 
 # Add STM32CubeMX generated sources
 add_subdirectory(cmake/stm32cubemx)

+ 34 - 0
Core/Inc/ring_buffer.h

@@ -0,0 +1,34 @@
+//
+// Created by EDZ on 25-9-23.
+//
+
+#ifndef RING_BUFFER_H
+#define RING_BUFFER_H
+
+
+#include <stdint.h>
+
+#define QUEUE_SIZE 10   // 队列大小,可以根据需求调整
+
+typedef struct {
+    uint8_t buffer[QUEUE_SIZE];
+    volatile uint16_t head;  // 读指针
+    volatile uint16_t tail;  // 写指针
+} RingBuffer;
+
+// 初始化
+void RingBuffer_Init(RingBuffer *q);
+
+// 判空
+int  RingBuffer_IsEmpty(RingBuffer *q);
+
+// 判满
+int  RingBuffer_IsFull(RingBuffer *q);
+
+// 入队
+int  RingBuffer_Enqueue(RingBuffer *q, uint8_t data);
+
+// 出队
+int  RingBuffer_Dequeue(RingBuffer *q, uint8_t *data);
+
+#endif //RING_BUFFER_H

+ 28 - 0
Core/Src/main.c

@@ -23,6 +23,7 @@
 /* USER CODE BEGIN Includes */
 #include <time.h>
 #include <stdlib.h>
+#include "ring_buffer.h"
 
 #include "string.h"
 #include "E52.h"
@@ -64,6 +65,10 @@ uint8_t uart2_rx_byte[10] = {0};
 uint8_t loraSendNextDataFlag = 0;
 uint8_t baseRandomTimer = 3*60;
 uint8_t RandomTimer= 3*60;
+
+RingBuffer queue1;
+RingBuffer queue2;
+
 // uint8_t loraDataErrorCount = 0;
 uint8_t workMode = 0;  // 0: 接收蓝牙数据 1: 使用lora发生数据 2:等待间隔时间
 uint8_t receiveBlDataCount = 0;
@@ -258,6 +263,29 @@ int main(void)
 
   powerOn();
   E52_CtlPowerOn_Fun();
+  uint8_t data;
+  uint8_t testVal = 0x10;   // 初始测试值
+
+  while (1)
+  {
+    // ===== 手动往 queue1 添加数据 =====
+    RingBuffer_Enqueue(&queue1, testVal++);
+    if (testVal > 0x1F) testVal = 0x10; // 模拟循环数据
+
+    // 如果 queue1 里有数据,就转存到 queue2
+    if (RingBuffer_Dequeue(&queue1, &data) == 0) {
+      RingBuffer_Enqueue(&queue2, data);
+    }
+
+    // 如果 queue2 有数据,就读出来并打印
+    if (RingBuffer_Dequeue(&queue2, &data) == 0) {
+      printf("Queue2 Data: 0x%02X\r\n", data);
+    }
+
+    HAL_Delay(1000);  // 1 秒打印一次
+  }
+
+
 
   // 启动 USART2 DMA 接收
   HAL_UART_Receive_DMA(&huart3, rx_buf, sizeof(rx_buf));

+ 36 - 0
Core/Src/ring_buffer.c

@@ -0,0 +1,36 @@
+//
+// Created by EDZ on 25-9-23.
+//
+
+#include "../Inc/ring_buffer.h"
+
+void RingBuffer_Init(RingBuffer *q) {
+    q->head = 0;
+    q->tail = 0;
+}
+
+int RingBuffer_IsEmpty(RingBuffer *q) {
+    return (q->head == q->tail);
+}
+
+int RingBuffer_IsFull(RingBuffer *q) {
+    return ((q->tail + 1) % QUEUE_SIZE == q->head);
+}
+
+int RingBuffer_Enqueue(RingBuffer *q, uint8_t data) {
+    if (RingBuffer_IsFull(q)) {
+        return -1;  // 队列已满
+    }
+    q->buffer[q->tail] = data;
+    q->tail = (q->tail + 1) % QUEUE_SIZE;
+    return 0;
+}
+
+int RingBuffer_Dequeue(RingBuffer *q, uint8_t *data) {
+    if (RingBuffer_IsEmpty(q)) {
+        return -1;  // 队列为空·
+    }
+    *data = q->buffer[q->head];
+    q->head = (q->head + 1) % QUEUE_SIZE;
+    return 0;
+}

+ 2 - 0
README.md

@@ -23,4 +23,6 @@
 
 55 BB 03 FC A5 01 C8  :请求蓝牙数据
 
+55 BB 03 FC A5 01 C8 00 FF EE :请求蓝牙数据
+
 55 BB 07 FC A5 03 34 60 FF EE :配置lora