瀏覽代碼

添加心跳包结构体,设备信息结构体。发送心跳包。

xuxinyi 2 月之前
父節點
當前提交
39f9dd7ea9
共有 5 個文件被更改,包括 67 次插入12 次删除
  1. 31 1
      Core/Inc/E52.h
  2. 0 1
      Core/Inc/main.h
  3. 18 1
      Core/Src/E52.c
  4. 16 7
      Core/Src/main.c
  5. 2 2
      Core/Src/stm32f1xx_it.c

+ 31 - 1
Core/Inc/E52.h

@@ -6,7 +6,37 @@
 #define E52_H
 #include "main.h"
 #include <stdio.h>
+#include <sys/types.h>
 #include "string.h"
 
+// 设备信息结构体
+typedef struct __attribute__((packed)){
+    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
+} Device_structure;
+
+// 只声明变量,不定义变量,使用extern关键字
+extern Device_structure deviceInfo;
+
+// 心跳数据结构体
+typedef struct __attribute__((packed)){
+    uint8_t frame_header_H;     // 帧头高字节
+    uint8_t frame_header_L;     // 帧头低字节
+    uint8_t function_code;      // 功能码
+    uint8_t badge_addr_high;    //胸牌地址高字节
+    uint8_t badge_addr_low;     //胸牌地址低字节
+    uint8_t broadcast_type;     // 广播类型
+    uint8_t target_addr_H;       // 目标地址高字节
+    uint8_t target_addr_L;   // 目标地址低字节
+    uint8_t frame_tail_H;    // 帧尾高字节
+    uint8_t frame_tail_L;    // 帧尾低字节
+} Heartbeat_structure;
+
+void E52_Heartbeat_Fun(void);
 void E52_Analyze_Data(void);
-#endif //E52_H
+
+#endif //E52_H

+ 0 - 1
Core/Inc/main.h

@@ -71,7 +71,6 @@ extern UART_HandleTypeDef huart2;
 extern UART_HandleTypeDef huart3;
 extern DMA_HandleTypeDef hdma_usart2_rx;
 extern uint8_t newLoraDataFlag;
-extern  uint8_t loraDeviceAddress[2];
 /* USER CODE END Private defines */
 
 #ifdef __cplusplus

+ 18 - 1
Core/Src/E52.c

@@ -4,6 +4,7 @@
 
 #include "../Inc/E52.h"
 
+Device_structure deviceInfo;
 /**
  *
  *设备向后台发生数据
@@ -11,6 +12,22 @@
  */
 void E52_Heartbeat_Fun() {
     printf("这是心跳包");
+    Heartbeat_structure heartbeat_structure;
+
+    heartbeat_structure.frame_header_H = 0x55;
+    heartbeat_structure.frame_header_L = 0xAA;
+    heartbeat_structure.function_code = 0x01;
+    heartbeat_structure.badge_addr_high = deviceInfo.loraDeviceAddress_H;
+    heartbeat_structure.badge_addr_low = deviceInfo.loraDeviceAddress_L;
+    heartbeat_structure.broadcast_type = deviceInfo.broadcast_type;
+    heartbeat_structure.target_addr_H = deviceInfo.target_addr_H;
+    heartbeat_structure.target_addr_L = deviceInfo.target_addr_L;
+    heartbeat_structure.frame_tail_H = 0xFF;
+    heartbeat_structure.frame_tail_L = 0xEE;
+
+    printf("heartbeat size = %d\n", sizeof(heartbeat_structure));
+
+    HAL_UART_Transmit(&huart2, (uint8_t *)&heartbeat_structure, sizeof(heartbeat_structure), HAL_MAX_DELAY);
     // TODO: command:01
 }
 
@@ -67,7 +84,7 @@ void E52_Analyze_Command_Fun() {
 
 void E52_Analyze_Data() {
     // uint16_t received_len = sizeof(rx_buf_uart2) - __HAL_DMA_GET_COUNTER(huart2.hdmarx);
-    printf("loraDeviceAddress: 0x%02X 0x%02X\r\n", loraDeviceAddress[0], loraDeviceAddress[1]);
+    printf("loraDeviceAddress: 0x%02X 0x%02X\r\n", deviceInfo.loraDeviceAddress_H,deviceInfo.loraDeviceAddress_L);
     if (rx_buf_uart2[0] == 0x55 && rx_buf_uart2[1] == 0xBB) {
         printf("The data is command\r\n");
     }else if (strncmp((char *)rx_buf_uart2, "SUCCESS", 7) == 0) {

+ 16 - 7
Core/Src/main.c

@@ -67,8 +67,6 @@ uint8_t receiveBlDataCount = 0;
 
 uint8_t newLoraDataFlag = 0;  //接收lora数据成功标志位。1:有新数据来。0.表示等待接收数据。后续可以改成队列类型。
 
-uint8_t loraDeviceAddress[2] = {0}; //
-
 /* USER CODE END PV */
 
 /* Private function prototypes -----------------------------------------------*/
@@ -128,6 +126,15 @@ void EnterSleepMode(void)
   HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
   // 或者使用WFE指令:HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFE);
 }
+
+void Device_Info_Init_Fun() {
+  deviceInfo.broadcast_type = 0x02;
+  deviceInfo.loraDeviceAddress_H = 0x00;
+  deviceInfo.loraDeviceAddress_L = 0x00;
+  deviceInfo.powerValue = 0;
+  deviceInfo.target_addr_H = 0xFF;
+  deviceInfo.target_addr_L = 0xFF;
+}
 /* USER CODE END 0 */
 
 /**
@@ -172,6 +179,7 @@ int main(void)
   // HAL_UART_Receive_IT(&huart2, uart2_rx_byte, 7);
   // 使能 USART2 空闲中断
   __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
+  Device_Info_Init_Fun();
   HAL_Delay(2000);
   // printf("开始初始化\r\n");
   // printf("切换为观察者模式\r\n");
@@ -283,13 +291,14 @@ int main(void)
       // HAL_Delay(1000);
       // //睡眠测试 --
       // printf("Hello world:%d\r\n",newLoraDataFlag);
-      if (newLoraDataFlag == 1) {
-        E52_Analyze_Data();
-        newLoraDataFlag = 0;//重置状态
-      }
+      // if (newLoraDataFlag == 1) {
+      //   E52_Analyze_Data();
+      //   newLoraDataFlag = 0;//重置状态
+      // }
+      E52_Heartbeat_Fun();
       // const char *end_msg = "SENDEND\r\n";
       // HAL_UART_Transmit(&huart2, (uint8_t *)end_msg, strlen(end_msg), HAL_MAX_DELAY);
-      // HAL_Delay(500);
+      HAL_Delay(1000);
     }
   }
   /* USER CODE END 3 */

+ 2 - 2
Core/Src/stm32f1xx_it.c

@@ -282,8 +282,8 @@ void USART2_IRQHandler(void)
         long addr = strtol(hexStr, NULL, 16);
 
         // 拆分为两个字节:高8位和低8位
-        loraDeviceAddress[0] = (addr >> 8) & 0xFF;  // 0xe1
-        loraDeviceAddress[1] = addr & 0xFF;         // 0x16
+        deviceInfo.loraDeviceAddress_H = (addr >> 8) & 0xFF;  // 0xe1
+        deviceInfo.loraDeviceAddress_L = addr & 0xFF;         // 0x16
       }
 
       // 清空缓冲区并重新开启DMA接收