|
|
@@ -277,7 +277,7 @@ void USART2_IRQHandler(void)
|
|
|
if (rx_len > 0)
|
|
|
{
|
|
|
// ====== 协议帧校验 ======
|
|
|
- if (rx_len >= 10 &&
|
|
|
+ if (rx_len == 12 &&
|
|
|
rx_buf_uart2_DMA[0] == 0x55 &&
|
|
|
rx_buf_uart2_DMA[1] == 0xBB &&
|
|
|
rx_buf_uart2_DMA[3] == deviceInfo.loraDeviceAddress_H &&
|
|
|
@@ -341,7 +341,7 @@ void USART2_IRQHandler(void)
|
|
|
void USART3_IRQHandler(void)
|
|
|
{
|
|
|
/* USER CODE BEGIN USART3_IRQn 0 */
|
|
|
-
|
|
|
+ // 可以在这里加断点调试或者统计中断次数
|
|
|
/* USER CODE END USART3_IRQn 0 */
|
|
|
HAL_UART_IRQHandler(&huart3);
|
|
|
/* USER CODE BEGIN USART3_IRQn 1 */
|
|
|
@@ -350,33 +350,40 @@ void USART3_IRQHandler(void)
|
|
|
__HAL_UART_CLEAR_IDLEFLAG(&huart3);
|
|
|
HAL_UART_DMAStop(&huart3);
|
|
|
|
|
|
- // uint32_t received_len = sizeof(rx_buf) - __HAL_DMA_GET_COUNTER(huart3.hdmarx);
|
|
|
-
|
|
|
- if (strncmp((char *)rx_buf, "AT", 2) != 0) {
|
|
|
- if (deviceInfo.BlDataFlag == BL_START) {
|
|
|
- // 检查队列是否已满
|
|
|
- if (RingBuffer_IsFull(&deviceInfo.queueBLData)) {
|
|
|
- uint8_t temp[DATA_SIZE];
|
|
|
- // 先出队一个数据腾出空间
|
|
|
- if (RingBuffer_Dequeue(&deviceInfo.queueBLData, temp) == 0) {
|
|
|
- // 可选:打印或处理被删除的数据
|
|
|
- // printf("队列满,出队一个数据腾出空间\n");
|
|
|
+ uint16_t rx_len = UART3_DMA_BUF_LEN - __HAL_DMA_GET_COUNTER(huart3.hdmarx);
|
|
|
+
|
|
|
+ if (rx_len > 0 && rx_len <= UART3_DMA_BUF_LEN)
|
|
|
+ {
|
|
|
+ // 避免 strcmp 越界,先判断长度再判断开头
|
|
|
+ if (!(rx_len >= 2 && rx_buf_uart3[0] == 'A' && rx_buf_uart3[1] == 'T'))
|
|
|
+ {
|
|
|
+ if (deviceInfo.BlDataFlag == BL_START)
|
|
|
+ {
|
|
|
+ // 队列已满则先出队一个,保证能入队
|
|
|
+ if (RingBuffer_IsFull(&deviceInfo.queueBLData)) {
|
|
|
+ uint8_t drop[DATA_SIZE];
|
|
|
+ RingBuffer_Dequeue(&deviceInfo.queueBLData, drop);
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- // 再入队新数据
|
|
|
- if (rx_buf[6] == 0xf0 && RingBuffer_Enqueue(&deviceInfo.queueBLData, rx_buf) == 0) {
|
|
|
- // 入队成功
|
|
|
- // printf("入队成功\n");
|
|
|
- } else {
|
|
|
- // 理论上不会再失败,因为已经腾出一个位置
|
|
|
- // printf("入队失败\n");
|
|
|
+ // 确保至少有7字节再判断 rx_buf[6]
|
|
|
+ if (rx_len >= 7 && rx_buf_uart3[6] == 0xF0)
|
|
|
+ {
|
|
|
+ // 临时缓存,避免 DMA 缓冲被清空后数据丢失
|
|
|
+ uint8_t temp_buf[UART3_DMA_BUF_LEN];
|
|
|
+ memcpy(temp_buf, rx_buf_uart3, rx_len);
|
|
|
+
|
|
|
+ // 这里建议 RingBuffer_Enqueue 支持传长度
|
|
|
+ if (RingBuffer_Enqueue(&deviceInfo.queueBLData, temp_buf) == 0) {
|
|
|
+ // 入队成功
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- memset(rx_buf, 0, UART3_DMA_BUF_LEN);
|
|
|
- HAL_UART_Receive_DMA(&huart3, rx_buf, UART3_DMA_BUF_LEN); // 重新启动
|
|
|
+ // 清空 DMA 缓冲 & 重新启动 DMA 接收
|
|
|
+ memset(rx_buf_uart3, 0, UART3_DMA_BUF_LEN);
|
|
|
+ HAL_UART_Receive_DMA(&huart3, rx_buf_uart3, UART3_DMA_BUF_LEN);
|
|
|
}
|
|
|
/* USER CODE END USART3_IRQn 1 */
|
|
|
}
|
|
|
@@ -419,11 +426,11 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
|
|
|
if (GPIO_Pin == SOS_KEY_Pin) {
|
|
|
if (HAL_GPIO_ReadPin(SOS_KEY_GPIO_Port, SOS_KEY_Pin) == GPIO_PIN_SET) {
|
|
|
// 松开(上升沿)
|
|
|
- printf("SOS_KEY 松开\r\n");
|
|
|
+ // printf("SOS_KEY 松开\r\n");
|
|
|
// deviceInfo.isSOS = FALSE;
|
|
|
} else {
|
|
|
// 按下(下降沿)
|
|
|
- printf("SOS_KEY 按下\r\n");
|
|
|
+ // printf("SOS_KEY 按下\r\n");
|
|
|
SOS_struct = currentTime; // 记录上报时间
|
|
|
// deviceInfo.isSOS = TRUE;
|
|
|
}
|
|
|
@@ -432,10 +439,10 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
|
|
|
else if (GPIO_Pin == JUGE_PIN_Pin) {
|
|
|
if (HAL_GPIO_ReadPin(JUGE_PIN_GPIO_Port, JUGE_PIN_Pin) == GPIO_PIN_SET) {
|
|
|
// 松开(上升沿)
|
|
|
- printf("JUGE_KEY 松开\r\n");
|
|
|
+ // printf("JUGE_KEY 松开\r\n");
|
|
|
} else {
|
|
|
// 按下(下降沿)
|
|
|
- printf("JUGE_KEY 按下\r\n");
|
|
|
+ // printf("JUGE_KEY 按下\r\n");
|
|
|
HAL_GPIO_WritePin(POWER_ON_GPIO_Port, POWER_ON_Pin, GPIO_PIN_RESET);
|
|
|
}
|
|
|
}
|