|
|
@@ -268,8 +268,8 @@ void USART2_IRQHandler(void)
|
|
|
/* 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
|
|
|
+ __HAL_UART_CLEAR_IDLEFLAG(&huart2); // 清除空闲标志
|
|
|
+ HAL_UART_DMAStop(&huart2); // 停止 DMA
|
|
|
|
|
|
// 实际接收长度
|
|
|
uint16_t rx_len = UART2_DMA_BUF_LEN - __HAL_DMA_GET_COUNTER(huart2.hdmarx);
|
|
|
@@ -278,34 +278,55 @@ void USART2_IRQHandler(void)
|
|
|
{
|
|
|
// ====== 协议帧校验 ======
|
|
|
if (rx_len == 12 &&
|
|
|
- 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[10] == 0xFF &&
|
|
|
- rx_buf_uart2_DMA[11] == 0xEE)
|
|
|
+ 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[10] == 0xFF &&
|
|
|
+ rx_buf_uart2_DMA[11] == 0xEE)
|
|
|
{
|
|
|
- if (rx_buf_uart2_DMA[2] == 0x0A || (GET_CMD(deviceInfo.commandFromCloud) == IDLE &&
|
|
|
- GET_STEP(deviceInfo.commandFromCloud) == STEP_INIT))
|
|
|
+ if (rx_buf_uart2_DMA[2] == 0x0A || rx_buf_uart2_DMA[2] == 0x05 || (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.isOnline = TRUE;
|
|
|
+ if (rx_buf_uart2_DMA[2] == 0x05)
|
|
|
+ {
|
|
|
+ deviceInfo.sleepDelayDataDuration = 0;//单独对某个设备进行睡眠,等待时间改为5秒
|
|
|
+ }
|
|
|
+ memcpy(rx_buf_uart2, rx_buf_uart2_DMA, rx_len); // 拷贝实际接收数据
|
|
|
deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_VERIFY);
|
|
|
}
|
|
|
}
|
|
|
+ else if (rx_buf_uart2_DMA[2] == 0x05) //睡眠最高权限
|
|
|
+ {
|
|
|
+ deviceInfo.isOnline = TRUE;
|
|
|
+ if (deviceInfo.sleepDelayDataDuration == 0)
|
|
|
+ {
|
|
|
+ deviceInfo.sleepDelayDataDuration = 60;//集体睡眠,而且没有配置时间,默认是1分钟
|
|
|
+ }
|
|
|
+ memcpy(rx_buf_uart2, rx_buf_uart2_DMA, rx_len); // 拷贝实际接收数据
|
|
|
+ deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_VERIFY);
|
|
|
+ }
|
|
|
+ else if (rx_buf_uart2_DMA[2] == 0x06) //获取睡眠延时时间
|
|
|
+ {
|
|
|
+ deviceInfo.isOnline = TRUE;
|
|
|
+ memcpy(rx_buf_uart2, rx_buf_uart2_DMA, rx_len); // 拷贝实际接收数据
|
|
|
+ E52_Get_Sleep_Time_Fun();
|
|
|
+ }
|
|
|
// ====== 判断 "SUCCESS" ======
|
|
|
- else if (rx_len >= 7 && strncmp((char *)rx_buf_uart2_DMA, "SUCCESS", 7) == 0)
|
|
|
+ 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)
|
|
|
+ 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");
|
|
|
+ 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) // 确保数据够长
|
|
|
+ if ((ptr + 4) <= ((char*)rx_buf_uart2_DMA + rx_len)) // 确保数据够长
|
|
|
{
|
|
|
char hexStr[5] = {0};
|
|
|
strncpy(hexStr, ptr, 4);
|
|
|
@@ -313,14 +334,14 @@ void USART2_IRQHandler(void)
|
|
|
|
|
|
deviceInfo.loraDeviceAddress_H = (addr >> 8) & 0x7F; //首位置空:因为修改type会改变地址
|
|
|
deviceInfo.loraDeviceAddress_L = addr & 0xFF;
|
|
|
- Flash_Write_LoraAddr(deviceInfo.loraDeviceAddress_H, deviceInfo.loraDeviceAddress_L);
|
|
|
+ // Flash_Write_LoraAddr(deviceInfo.loraDeviceAddress_H, deviceInfo.loraDeviceAddress_L);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 统一清空并重启 DMA
|
|
|
- memset(rx_buf_uart2_DMA, 0, UART2_DMA_BUF_LEN);
|
|
|
+ // 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 */
|