|
|
@@ -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++;
|