四、加入接收和中断处理的必要代码
1、开启中断、启动接收
__HAL_UART_CLEAR_IDLEFLAG(&huart7); //要清除一次IDLE标志
__HAL_UART_ENABLE_IT(&huart7, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart7, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart7, UART7_RxBuffer, 1024);//DMA接收串口数据,接收的长度设的足够大
2、串口中断处理
void UART7_IRQHandler(void)
{
/* USER CODE BEGIN UART7_IRQn 0 */
uint32 ret=0;
/* USER CODE END UART7_IRQn 0 */
HAL_UART_IRQHandler(&huart7);
/* USER CODE BEGIN UART7_IRQn 1 */
uint16 len=0;
if(__HAL_UART_GET_FLAG(&huart7, UART_FLAG_IDLE) != RESET&& __HAL_UART_GET_IT_SOURCE(&huart7, UART_IT_RXNE) != RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart7); //需手动清除IDLE中断标志
HAL_UART_DMAStop(&huart7); //关闭串口DMA
len = 1024 - __HAL_DMA_GET_COUNTER(&hdma_uart7_rx);
//加入用户对数据的处理代码,最好是把UART7_RxBuffer数据拷贝到另外的缓存在中断外面去处理
printf("%d:%srn",len,UART7_RxBuffer);
memset(UART7_RxBuffer, 0, 1024);
__HAL_DMA_SET_COUNTER(&hdma_uart7_rx, 0); //清除DMA 计数
__HAL_UART_ENABLE_IT(&huart7, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart7, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart7, UART7_RxBuffer, 1024);//继续接收数据
}
/* USER CODE END UART7_IRQn 1 */
}