xuxinyi 1 ماه پیش
والد
کامیت
ea4aec64c1
4فایلهای تغییر یافته به همراه48 افزوده شده و 49 حذف شده
  1. 1 34
      Core/Inc/E52.h
  2. 38 0
      Core/Inc/Global.h
  3. 3 2
      Core/Src/main.c
  4. 6 13
      Core/Src/stm32f1xx_it.c

+ 1 - 34
Core/Inc/E52.h

@@ -11,6 +11,7 @@
 #include "stdlib.h"
 #include "RTC_SLEEP.h"
 #include "ring_buffer.h"
+#include "Global.h"
 // 组合命令和步骤的宏
 #define COMBINE_CMD_STEP(cmd, step) ((cmd) | (step))
 
@@ -107,40 +108,6 @@ typedef enum {
     BROADCAST_ALL               //广播
 }BROADCAST;
 
-// 设备信息结构体
-typedef struct {
-    uint8_t isOnline;            // 设备是否就绪
-    uint8_t broadcast_type;         // 广播类型             01:单波 02:广播 03:多播
-    uint8_t loraDeviceAddress_H;    //设备地址高位           默认0
-    uint8_t loraDeviceAddress_L;    //设备地址低位           默认0
-    uint8_t target_addr_H;          // 目标地址高字节         默认FF
-    uint8_t target_addr_L;          // 目标地址低字节         默认FF
-    uint8_t powerValue;             //电量                  默认0
-    // uint8_t isSOS;
-    // uint8_t receivingNewDataFlag;       //接收lora新数据
-
-    //使能蓝牙收发数据
-    uint8_t BlDataFlag;         //BL_START:开始接收新蓝牙数据,BL_STOP.停止接收新蓝牙数据
-
-    //后台的远程命令
-    uint8_t commandFromCloud; //从云端接收到的命令     1.请求蓝牙数据,2.请求lora数据,3.睡眠 4,重新发送点卯数据
-
-    //lora发生成功标志
-    // uint8_t loraSendSuccessFlag;
-
-    //rtc定时唤醒时间
-    uint32_t rtc_wake_up_time;
-
-    uint16_t forwardBLAndLoraDataDuration;   //发送蓝牙间隔时间
-    uint8_t forwardBLAndLoraDataCount;   //发送蓝牙数量
-    uint8_t forwardBLAndLoraDataCountMax;  //发送蓝牙数量最大值
-
-    RingBuffer queueBLData;                 //蓝牙数据队列
-    RingBuffer queueLoraCommandData;        //命令数据队列
-
-} Device_structure;
-
-
 // 只声明变量,不定义变量,使用extern关键字
 extern Device_structure deviceInfo;
 

+ 38 - 0
Core/Inc/Global.h

@@ -4,5 +4,43 @@
 
 #ifndef GLOBAL_H
 #define GLOBAL_H
+#include <stdio.h>
+#include "string.h"
+#include "stdlib.h"
+#include <sys/types.h>
+
+#include "ring_buffer.h"
+// 设备信息结构体
+typedef struct {
+    uint8_t isOnline;            // 设备是否就绪
+    uint8_t broadcast_type;         // 广播类型             01:单波 02:广播 03:多播
+    uint8_t loraDeviceAddress_H;    //设备地址高位           默认0
+    uint8_t loraDeviceAddress_L;    //设备地址低位           默认0
+    uint8_t target_addr_H;          // 目标地址高字节         默认FF
+    uint8_t target_addr_L;          // 目标地址低字节         默认FF
+    uint8_t powerValue;             //电量                  默认0
+    // uint8_t isSOS;
+    // uint8_t receivingNewDataFlag;       //接收lora新数据
+
+    //使能蓝牙收发数据
+    uint8_t BlDataFlag;         //BL_START:开始接收新蓝牙数据,BL_STOP.停止接收新蓝牙数据
+
+    //后台的远程命令
+    uint8_t commandFromCloud; //从云端接收到的命令     1.请求蓝牙数据,2.请求lora数据,3.睡眠 4,重新发送点卯数据
+
+    //lora发生成功标志
+    uint8_t loraSendSuccessFlag;
+
+    //rtc定时唤醒时间
+    uint32_t rtc_wake_up_time;
+
+    uint16_t forwardBLAndLoraDataDuration;   //发送蓝牙间隔时间
+    uint8_t forwardBLAndLoraDataCount;   //发送蓝牙数量
+    uint8_t forwardBLAndLoraDataCountMax;  //发送蓝牙数量最大值
+
+    RingBuffer queueBLData;                 //蓝牙数据队列
+    RingBuffer queueLoraCommandData;        //命令数据队列
+
+} Device_structure;
 
 #endif //GLOBAL_H

+ 3 - 2
Core/Src/main.c

@@ -313,7 +313,7 @@ int main(void) {
         if (GET_CMD(deviceInfo.commandFromCloud) == IDLE || GET_STEP(deviceInfo.commandFromCloud) == STEP_INIT) {
             HAL_RTC_GetTime(&hrtc, &IDLE_struct, RTC_FORMAT_BIN); // 直接更新
         } else {
-            if (IsTimeElapsed(&hrtc, &IDLE_struct, 20 * 60)) {
+            if (IsTimeElapsed(&hrtc, &IDLE_struct, 30)) {
                 deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
                 // E52_AT_TYPE_Fun(E52_TYPE_REPEATER);
             }
@@ -344,6 +344,7 @@ int main(void) {
                     } else {
                         //擦除缓存
                         if (RingBuffer_Dequeue(&deviceInfo.queueBLData, sentData_Temp) == 0) {
+                            printf("擦除数据中\r\n");
                             continue;
                         }
                         // printf("发送最后一位,开始发送蓝牙数据给Lora\r\n");
@@ -413,7 +414,7 @@ int main(void) {
 
                 case STEP_COMPLETE:
                     printf("心跳发送3\r\n");
-                    E52_Heartbeat_Fun();
+//                    E52_Heartbeat_Fun(); //配置完成,发送心跳包会导致后台循环发布配置命令
                     deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
                     break;
 

+ 6 - 13
Core/Src/stm32f1xx_it.c

@@ -285,27 +285,18 @@ void USART2_IRQHandler(void)
           rx_buf_uart2_DMA[10] == 0xFF &&
           rx_buf_uart2_DMA[11] == 0xEE)
       {
-        if (GET_CMD(deviceInfo.commandFromCloud) == IDLE &&
-            GET_STEP(deviceInfo.commandFromCloud) == STEP_INIT)
+        if (rx_buf_uart2_DMA[2] == 0x0A || (GET_CMD(deviceInfo.commandFromCloud) == IDLE &&
+            GET_STEP(deviceInfo.commandFromCloud) == STEP_INIT))
         {
+            deviceInfo.isOnline = TRUE;
           memcpy(rx_buf_uart2, rx_buf_uart2_DMA, rx_len);   // 拷贝实际接收数据
           deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_VERIFY);
-          //测试将命令加入队列
-          if (RingBuffer_Enqueue(&deviceInfo.queueLoraCommandData, rx_buf_uart2_DMA) == 0) {
-            // 入队成功
-          } else {
-            // 入队失败(已满暂停入队)
-          }
-        }
-        else if (rx_buf_uart2_DMA[2] == 0x0A) { //意外情况,后台控制恢复初始状态
-          deviceInfo.isOnline = TRUE;
-          deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
         }
       }
       // ====== 判断 "SUCCESS" ======
       else if (rx_len >= 7 && strncmp((char *)rx_buf_uart2_DMA, "SUCCESS", 7) == 0)
       {
-        // deviceInfo.loraSendSuccessFlag = 0;
+         deviceInfo.loraSendSuccessFlag = 0;
       }
       // ====== 判断 "AT" 指令 ======
       else if (rx_len >= 2 && strncmp((char *)rx_buf_uart2_DMA, "AT", 2) == 0)
@@ -428,9 +419,11 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
       // 松开(上升沿)
       // printf("SOS_KEY 松开\r\n");
       // deviceInfo.isSOS = FALSE;
+        __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
     } else {
       // 按下(下降沿)
       // printf("SOS_KEY 按下\r\n");
+        __HAL_UART_DISABLE_IT(&huart3, UART_IT_IDLE);
       SOS_struct = currentTime;  // 记录上报时间
       // deviceInfo.isSOS = TRUE;
     }