STM32串口/485 DMA空闲接收数据只有1个字节
·
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);}
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)