空闲中断不定长数据接收
STM32 HAL库 串口空闲中断
开启
1
| __HAL_UART_ENABLE_IT(&huartX, UART_IT_IDLE);
|
这时候启动传输
1
| HAL_UART_Receive_DMA(&huartx, addr, len);
|
在中断函数中
1 2 3 4 5 6 7 8 9 10
| if(USART3->SR&0x10) { __HAL_UART_CLEAR_IDLEFLAG(&huartX); if(addr[0]!=0x5a) { HAL_UART_AbortReceive(&huart3); HAL_UART_Receive_DMA(&huartX, addr, 82); } }
|
不定长DMA接收
1 2 3 4 5 6 7 8 9 10
| if(USART1->SR&0x10) { __HAL_UART_CLEAR_IDLEFLAG(&huart1); if(rxdata[0]==0x55) { HAL_UART_RxCpltCallback(&huart1); } HAL_UART_AbortReceive(&huart1); HAL_UART_Receive_DMA(&huart1, rxdata, 50); }
|
与定长不同的地方是无论验证包数据是否成功 都进行重置 当验证成功后处理包数据
也可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| if(USART3->SR&0x10)//如果是空闲中断 { __HAL_UART_CLEAR_IDLEFLAG(&huartX);//清除空闲中断标志 if(addr[0]!=0x5a)//验证包头 或者其他验证数据有效性方法 { HAL_UART_AbortReceive(&huart3);//终止传输 HAL_UART_Receive_DMA(&huartX, addr, 82);//重启传输 } if(addr[len-DMA剩余长度-1]==0x55)//验证包尾 或者其他验证数据完整性方法 { HAL_UART_AbortReceive(&huart3);//终止传输 HAL_UART_Receive_DMA(&huartX, addr, 82);//重启传输 fun()//处理数据代码 } //好处是 如果包头验证成功 而没有检测到包尾 就跳过本次空闲中断 以接收完整数据 不过在包内加上字长节防止数据错误 }
|