单片机型号: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);
}
}