本文主要是介绍【HMGD】GD32/STM32 DMA接收不定长串口数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
单片机型号:GD32F303系列
CubeMX配置
配置串口参数
开启DMA
开启中断
示例代码
使用到的变量
uint8_t RX_Buff_FLAG = 0;
uint8_t RX_Buff[300] = {0};
uint8_t TX_Buff[300] = {0};
串口接收空闲函数
// 串口接收空闲函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart == &huart2){RX_Buff_FLAG = 1;RX_Length = 300 - __HAL_DMA_GET_COUNTER(huart->hdmarx);HAL_GPIO_WritePin(USART2_CTS_GPIO_Port, USART2_CTS_Pin, GPIO_PIN_RESET);HAL_UARTEx_ReceiveToIdle_DMA(&huart2, RX_Buff, 300);}
}
主函数
HAL_GPIO_WritePin(USART2_CTS_GPIO_Port, USART2_CTS_Pin, GPIO_PIN_RESET);
// 启动串口DMA接收
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, RX_Buff, 300);while(1)
{// 等待接收if(RX_Buff_FLAG == 1){RX_Buff_FLAG = 0;HAL_GPIO_WritePin(USART2_CTS_GPIO_Port, USART2_CTS_Pin, GPIO_PIN_SET);// 发送数据TX_Buff[0] = 0x01;TX_Buff[1] = 0x02;TX_Buff[2] = 0x03;HAL_UART_Transmit_DMA(&huart2, TX_Buff, 10);}
}
出现BUG
当使用115200进行通信没问题,然后切换到其他波特率发送数据后,在切换到115200进行通信就会无法接收数据
解决办法
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{if(huart == &huart2){HAL_GPIO_WritePin(USART2_CTS_GPIO_Port, USART2_CTS_Pin, GPIO_PIN_RESET);HAL_UARTEx_ReceiveToIdle_DMA(&huart2, TX_Buff, 300);}
}
这篇关于【HMGD】GD32/STM32 DMA接收不定长串口数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!