1.通过stm32cubeMx使能usart1并使能usart1中断,开启usart1的接受DMA
2.在void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)函数的最后添加
//使能空闲中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE)。
huart1为usart1句柄。
UART_IT_IDLE为串口空闲的一个宏
3.在main函数紧挨着while(1)且在while(1)前面的地方加入
//开启DMA搬运
HAL_UART_Receive_DMA(&huart1, DMA_Usart1_RxBuffer, RXLENGHT)。
huart1为串口的句柄,DMA_Usart1_RxBuffer为DMA搬运到的目的地(一个数组)。
RXLENGHT为需要搬运的大小
4.在stm32f4xx_it.c文件中的USART1_IRQHandler函数修改为:
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint16_t uart1_rece_len = 0;
//判断是否产生空闲中断
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) == SET){
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除中断标志
// huart1.Instance->SR;
// huart1.Instance->DR;
//停止DMA
HAL_UART_DMAStop(&huart1);
//将接受长度求出
uart1_rece_len = RXLENGHT - hdma_usart1_rx.Instance->NDTR;//试试这里能不能通过strlen求出长度
//将接受的数据添加到uart1_msg_S中,每次对USArt1进行读取后都需要清空缓冲区
uart1_msg_S.len = strlen((char*)uart1_msg_S.data);
memcpy((void*)(&uart1_msg_S.data[uart1_msg_S.len]), (void*)DMA_Usart1_RxBuffer, uart1_rece_len);
//将DMA_Usart1_RxBuffer清空
memset((void*)DMA_Usart1_RxBuffer, 0, RXLENGHT);
//再次开启DMA
HAL_UART_Receive_DMA(&huart1, DMA_Usart1_RxBuffer, RXLENGHT);
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
这个代码我还没有来得及试,试了之后再修改