Quellcode durchsuchen

缩减缓冲区大小,优惠串口2代码

xuxinyi vor 2 Monaten
Ursprung
Commit
30e503284f
3 geänderte Dateien mit 58 neuen und 43 gelöschten Zeilen
  1. 4 4
      Core/Inc/main.h
  2. 4 4
      Core/Src/main.c
  3. 50 35
      Core/Src/stm32f1xx_it.c

+ 4 - 4
Core/Inc/main.h

@@ -70,12 +70,12 @@ void Error_Handler(void);
 #define PowerLED_GPIO_Port GPIOB
 
 /* USER CODE BEGIN Private defines */
-extern uint8_t rx_buf[100];
-extern uint8_t rx_buf_uart2[100];
-extern uint8_t rx_buf_uart2_DMA[100];
+extern uint8_t rx_buf[25];
+extern uint8_t rx_buf_uart2[25];
+extern uint8_t rx_buf_uart2_DMA[25];
 extern  uint8_t loraSendNextDataFlag;
 // extern uint8_t loraDataErrorCount;
-extern uint8_t totalData[120][50];
+extern uint8_t totalData[50][25];
 extern  RTC_HandleTypeDef hrtc;
 extern uint8_t workMode;  // 0: 接收蓝牙数据 1: 使用lora发生数据。
 extern uint8_t receiveBlDataCount;

+ 4 - 4
Core/Src/main.c

@@ -56,10 +56,10 @@ DMA_HandleTypeDef hdma_usart2_rx;
 DMA_HandleTypeDef hdma_usart3_rx;
 
 /* USER CODE BEGIN PV */
-uint8_t rx_buf[100] = {0};
-uint8_t rx_buf_uart2[100] = {0};
-uint8_t rx_buf_uart2_DMA[100] = {0};
-uint8_t totalData[120][50] = {0};
+uint8_t rx_buf[25] = {0};
+uint8_t rx_buf_uart2[25] = {0};
+uint8_t rx_buf_uart2_DMA[25] = {0};
+uint8_t totalData[50][25] = {0};
 uint8_t uart2_rx_byte[10] = {0};
 uint8_t loraSendNextDataFlag = 0;
 uint8_t baseRandomTimer = 3*60;

+ 50 - 35
Core/Src/stm32f1xx_it.c

@@ -279,55 +279,70 @@ void TIM4_IRQHandler(void)
 /**
   * @brief This function handles USART2 global interrupt.
   */
+#define UART2_DMA_BUF_LEN   25
+
 void USART2_IRQHandler(void)
 {
   /* USER CODE BEGIN USART2_IRQn 0 */
-
   /* USER CODE END USART2_IRQn 0 */
   HAL_UART_IRQHandler(&huart2);
-  /* USER CODE BEGIN USART2_IRQn 1 */
 
-  // 检测空闲中断
+  /* USER CODE BEGIN USART2_IRQn 1 */
   if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE))
   {
     __HAL_UART_CLEAR_IDLEFLAG(&huart2);    // 清除空闲标志
     HAL_UART_DMAStop(&huart2);             // 停止 DMA
 
-    if (rx_buf_uart2_DMA[0] == 0x55 && rx_buf_uart2_DMA[1] == 0xBB && rx_buf_uart2_DMA[3] == deviceInfo.loraDeviceAddress_H && rx_buf_uart2_DMA[4] == deviceInfo.loraDeviceAddress_L && rx_buf_uart2_DMA[8] == 0xFF && rx_buf_uart2_DMA[9] == 0xEE){
-      if (GET_CMD(deviceInfo.commandFromCloud) == IDLE && GET_STEP(deviceInfo.commandFromCloud) == STEP_INIT ) {
-        memcpy(rx_buf_uart2 ,rx_buf_uart2_DMA, sizeof(rx_buf_uart2_DMA));
-        deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_VERIFY);  //初始化  命令和步骤。说明有新数据过来
+    // 实际接收长度
+    uint16_t rx_len = UART2_DMA_BUF_LEN - __HAL_DMA_GET_COUNTER(huart2.hdmarx);
+
+    if (rx_len > 0)
+    {
+      // ====== 协议帧校验 ======
+      if (rx_len >= 10 &&
+          rx_buf_uart2_DMA[0] == 0x55 &&
+          rx_buf_uart2_DMA[1] == 0xBB &&
+          rx_buf_uart2_DMA[3] == deviceInfo.loraDeviceAddress_H &&
+          rx_buf_uart2_DMA[4] == deviceInfo.loraDeviceAddress_L &&
+          rx_buf_uart2_DMA[8] == 0xFF &&
+          rx_buf_uart2_DMA[9] == 0xEE)
+      {
+        if (GET_CMD(deviceInfo.commandFromCloud) == IDLE &&
+            GET_STEP(deviceInfo.commandFromCloud) == STEP_INIT)
+        {
+          memcpy(rx_buf_uart2, rx_buf_uart2_DMA, rx_len);   // 拷贝实际接收数据
+          deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_VERIFY);
+        }
       }
-    }else if (strncmp((char *)rx_buf_uart2_DMA, "SUCCESS", 7) == 0) {
-      deviceInfo.loraSendSuccessFlag = 0;
-      memset(rx_buf_uart2_DMA, 0, sizeof(rx_buf_uart2_DMA));
-    }else if (strncmp((char *)rx_buf_uart2_DMA, "AT", 2) == 0) {
-      char *ptr = strstr((char *)rx_buf_uart2_DMA, "SRC_ADDR=0x");
-      if (ptr != NULL) {
-        // 移动指针到十六进制数值部分(跳过"SRC_ADDR=0x")
-        ptr += strlen("SRC_ADDR=0x");
-
-        // 解析前4个十六进制字符(例如"e116")
-        char hexStr[5] = {0};  // 存储4个字符加结束符
-        strncpy(hexStr, ptr, 4);
-
-        // 转换为32位整数
-        long addr = strtol(hexStr, NULL, 16);
-
-        // 拆分为两个字节:高8位和低8位
-        deviceInfo.loraDeviceAddress_H = (addr >> 8) & 0xFF;  // 0xe1
-        deviceInfo.loraDeviceAddress_L = addr & 0xFF;         // 0x16
+      // ====== 判断 "SUCCESS" ======
+      else if (rx_len >= 7 && strncmp((char *)rx_buf_uart2_DMA, "SUCCESS", 7) == 0)
+      {
+        deviceInfo.loraSendSuccessFlag = 0;
+      }
+      // ====== 判断 "AT" 指令 ======
+      else if (rx_len >= 2 && strncmp((char *)rx_buf_uart2_DMA, "AT", 2) == 0)
+      {
+        char *ptr = strstr((char *)rx_buf_uart2_DMA, "SRC_ADDR=0x");
+        if (ptr != NULL)
+        {
+          ptr += strlen("SRC_ADDR=0x");
+          if ((ptr - (char *)rx_buf_uart2_DMA) + 4 <= rx_len) // 确保数据够长
+          {
+            char hexStr[5] = {0};
+            strncpy(hexStr, ptr, 4);
+            long addr = strtol(hexStr, NULL, 16);
+
+            deviceInfo.loraDeviceAddress_H = (addr >> 8) & 0xFF;
+            deviceInfo.loraDeviceAddress_L = addr & 0xFF;
+          }
+        }
       }
-      memset(rx_buf_uart2_DMA, 0, sizeof(rx_buf_uart2_DMA));
-      // // 清空缓冲区并重新开启DMA接收
-      // memset(rx_buf_uart2, 0, sizeof(rx_buf_uart2));
-      // HAL_UART_Receive_DMA(&huart2, rx_buf_uart2, sizeof(rx_buf_uart2));
     }
-    memset(rx_buf_uart2_DMA, 0, sizeof(rx_buf_uart2_DMA));
-    // 重新开启 DMA 接收
-    HAL_UART_Receive_DMA(&huart2, rx_buf_uart2_DMA, sizeof(rx_buf_uart2_DMA));
-  }
 
+    // 统一清空并重启 DMA
+    memset(rx_buf_uart2_DMA, 0, UART2_DMA_BUF_LEN);
+    HAL_UART_Receive_DMA(&huart2, rx_buf_uart2_DMA, UART2_DMA_BUF_LEN);
+  }
   /* USER CODE END USART2_IRQn 1 */
 }
 
@@ -350,7 +365,7 @@ void USART3_IRQHandler(void)
 
     if (strncmp((char *)rx_buf, "AT", 2) != 0) {
       if (deviceInfo.BlDataFlag == BL_START) {
-        if (receiveBlDataCount < 115)
+        if (receiveBlDataCount < 45)
         {
           memcpy(totalData[receiveBlDataCount], rx_buf, received_len);
           receiveBlDataCount++;