STM32串口/485 DMA空闲接收数据只有1个字节

1、问题:在使用两块板卡通信时,发现其中一个485接口接收数据时有问题。最开始收到的几帧数据是正常的,但是后面的数据就有问题了,每次只接收了1个字节的数据。

2、原因:串口接收时出现了溢出错误之后,没有清除错误状态标志。

3、解决方法:使用错误回调函数,清除错误标志,重启空闲中断

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
    // 检查是否发生帧错误
    if (huart->ErrorCode & HAL_UART_ERROR_FE) {
        // 清除帧错误标志
        __HAL_UART_CLEAR_FEFLAG(huart);
        // 重置接收状态
        huart->RxState = HAL_UART_STATE_READY;
        // 重新启用空闲中断
        __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
    }

    // 检查是否发生噪声错误
    if (huart->ErrorCode & HAL_UART_ERROR_NE) {
        // 清除噪声错误标志
        __HAL_UART_CLEAR_NEFLAG(huart);
        // 重置接收状态
        huart->RxState = HAL_UART_STATE_READY;
        // 重新启用空闲中断
        __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
    }

    // 检查是否发生溢出错误
    if (huart->ErrorCode & HAL_UART_ERROR_ORE) {
        // 清除溢出错误标志
        __HAL_UART_CLEAR_OREFLAG(huart);
        // 重置接收状态
        huart->RxState = HAL_UART_STATE_READY;
        // 重新启用空闲中断
        __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
    }
	if(huart->Instance == USART1)	{HAL_UART_Receive_DMA(&huart1, (uint8_t *)Usart1_Recv_Data.usart1_Recv, USART1_RECV_MAX);}	
    else if(huart->Instance == USART2)	{HAL_UART_Receive_DMA(&huart2, (uint8_t *)Usart2_Recv_Data.usart2_Recv, USART2_RECV_MAX);}
    else if(huart->Instance == USART3)	{HAL_UART_Receive_DMA(&huart3, (uint8_t *)Usart3_Recv_Data.usart3_Recv, USART3_RECV_MAX);}
    else if(huart->Instance == UART4)	{HAL_UART_Receive_DMA(&huart4, (uint8_t *)Uart4_Recv_Data.uart4_Recv, UART4_RECV_MAX);}
    else if(huart->Instance == UART5)	{HAL_UART_Receive_DMA(&huart5, (uint8_t *)Uart5_Recv_Data.uart5_Recv, UART5_RECV_MAX);}
    else if(huart->Instance == USART6)	{HAL_UART_Receive_DMA(&huart6, (uint8_t *)Usart6_Recv_Data.usart6_Recv, USART6_RECV_MAX);}
	else if(huart->Instance == UART7)	{HAL_UART_Receive_DMA(&huart7, (uint8_t *)Uart7_Recv_Data.uart7_Recv, UART7_RECV_MAX);}
}
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐