Переглянути джерело

后台发生蓝牙搜索命令,进行定时搜索。

xuxinyi 2 місяців тому
батько
коміт
fbb24669f1
4 змінених файлів з 39 додано та 12 видалено
  1. 3 0
      Core/Inc/E52.h
  2. 9 6
      Core/Src/E52.c
  3. 16 2
      Core/Src/main.c
  4. 11 4
      Core/Src/stm32f1xx_it.c

+ 3 - 0
Core/Inc/E52.h

@@ -57,6 +57,9 @@ typedef struct __attribute__((packed)){
     //后台的远程命令
     uint8_t commandFromCloud; //从云端接收到的命令     1.请求蓝牙数据,2.请求lora数据,3.睡眠 4,重新发送点卯数据
 
+    //lora发生成功标志
+    uint8_t loraSendSuccessFlag;
+
     //定时器相关
     uint8_t  timerEnable;           //定时器使能
     uint16_t timeCount;             //定时器计数

+ 9 - 6
Core/Src/E52.c

@@ -45,6 +45,8 @@ void E52_Send_Bl_Data_Fun(uint8_t i) {
     sendBlData_structure.frame_tail_L = 0xEE;
     printf("blData size = %d\n", sizeof(sendBlData_structure));
 
+
+    deviceInfo.loraSendSuccessFlag = 1;
     HAL_UART_Transmit(&huart2, (uint8_t *)&sendBlData_structure, sizeof(sendBlData_structure), HAL_MAX_DELAY);
     // TODO: command:02
 }
@@ -105,7 +107,7 @@ void E52_Heartbeat_Fun1() {
 void E52_Analyze_Data() {
     // uint16_t received_len = sizeof(rx_buf_uart2) - __HAL_DMA_GET_COUNTER(huart2.hdmarx);
 
-    if (rx_buf_uart2[0] == 0x55 && rx_buf_uart2[1] == 0xBB) {
+    if (rx_buf_uart2[0] == 0x55 && rx_buf_uart2[1] == 0xBB && deviceInfo.commandFromCloud == IDLE) {
         // 根据接收到的第三个字节(命令字节)进行分支处理
         switch (rx_buf_uart2[2]) {
             case REQUEST_BLUETOOTH_DATA:
@@ -126,11 +128,12 @@ void E52_Analyze_Data() {
                 break;
         }
     }
-    // 清空缓冲区(可选)
-    memset(rx_buf_uart2, 0, sizeof(rx_buf_uart2));
-    // 重新开启 DMA 接收
-    HAL_UART_Receive_DMA(&huart2, rx_buf_uart2, sizeof(rx_buf_uart2));
-    deviceInfo.newLoraDataFlag = 0;//重置状态
+    // memset(rx_buf_uart2, 0, sizeof(rx_buf_uart2));
+    // // 清空缓冲区(可选)
+    // memset(rx_buf_uart2, 0, sizeof(rx_buf_uart2));
+    // // 重新开启 DMA 接收
+    // HAL_UART_Receive_DMA(&huart2, rx_buf_uart2, sizeof(rx_buf_uart2));
+    // deviceInfo.newLoraDataFlag = 0;//重置状态
 }
 
 

+ 16 - 2
Core/Src/main.c

@@ -139,6 +139,7 @@ void Device_Info_Init_Fun() {
   deviceInfo.newLoraDataFlag = 0;
   deviceInfo.isReady = 0;
   deviceInfo.commandFromCloud = IDLE;
+  deviceInfo.loraSendSuccessFlag = 0;
   //TODO: 大循环,获取设备地址信息,否则重新发送。发送上线信息,等待反馈,否则重新发送上线信息。一切准备就绪后,开启isready为1,进入工作模式。
   // while (1){}
 }
@@ -284,6 +285,8 @@ int main(void)
     /* USER CODE END WHILE */
 
     /* USER CODE BEGIN 3 */
+    //检测是否有新的lora 数据判断
+    //TODO 应该防止频繁调用此函数。如果command 是IDLE,则调用此函数。
     if (deviceInfo.newLoraDataFlag == 1) {
       // printf("loraDeviceAddress: 0x%02X 0x%02X\r\n", deviceInfo.loraDeviceAddress_H,deviceInfo.loraDeviceAddress_L);
       E52_Analyze_Data();
@@ -296,12 +299,23 @@ int main(void)
         Timer_Managment_Fun(&htim4, TIMER_OP_STOP);
         deviceInfo.BlDataFlag = BL_STOP;
         while (receiveBlDataCount >= i) {
-          i++;
+
           printf("发送第%d个蓝牙数据给Lora\r\n", i);
-          E52_Send_Bl_Data_Fun(i);
+          if (deviceInfo.loraSendSuccessFlag == 0) {
+            E52_Send_Bl_Data_Fun(i);
+          }else {
+            continue;
+          }
+          memset(totalData[i], 0, sizeof(totalData[i]));
+          i++;
         }
+        receiveBlDataCount = 0;
+        deviceInfo.timeCount = 0;
+        deviceInfo.forwardBLAndLoraDataDuration = 0;
+        i = 0;
 
         deviceInfo.commandFromCloud = IDLE;
+        // 清空缓冲区(可选)
         //TODO 停止计时器后,将数据发送出去。
         printf("停止蓝牙扫描,开始发送蓝牙数据给Lora\r\n");
       }else {

+ 11 - 4
Core/Src/stm32f1xx_it.c

@@ -302,13 +302,20 @@ void USART2_IRQHandler(void)
         deviceInfo.loraDeviceAddress_H = (addr >> 8) & 0xFF;  // 0xe1
         deviceInfo.loraDeviceAddress_L = addr & 0xFF;         // 0x16
       }
-
-      // 清空缓冲区并重新开启DMA接收
       memset(rx_buf_uart2, 0, sizeof(rx_buf_uart2));
-      HAL_UART_Receive_DMA(&huart2, rx_buf_uart2, sizeof(rx_buf_uart2));
-    } else if (rx_buf_uart2[3] == deviceInfo.loraDeviceAddress_H && rx_buf_uart2[4] == deviceInfo.loraDeviceAddress_L){
+      // // 清空缓冲区并重新开启DMA接收
+      // memset(rx_buf_uart2, 0, sizeof(rx_buf_uart2));
+      // HAL_UART_Receive_DMA(&huart2, rx_buf_uart2, sizeof(rx_buf_uart2));
+    }if (strncmp((char *)rx_buf_uart2, "SUCCESS", 7) == 0) {
+      deviceInfo.loraSendSuccessFlag = 0;
+      memset(rx_buf_uart2, 0, sizeof(rx_buf_uart2));
+    }else if (rx_buf_uart2[3] == deviceInfo.loraDeviceAddress_H && rx_buf_uart2[4] == deviceInfo.loraDeviceAddress_L){
       deviceInfo.newLoraDataFlag = 1;
+    }else {
+      memset(rx_buf_uart2, 0, sizeof(rx_buf_uart2));
     }
+    // 重新开启 DMA 接收
+    HAL_UART_Receive_DMA(&huart2, rx_buf_uart2, sizeof(rx_buf_uart2));
     // // 计算接收到的数据长度
     // uint32_t received_len = sizeof(rx_buf_uart2) - __HAL_DMA_GET_COUNTER(huart2.hdmarx);
     //