UART异步通信配置步骤/HAL
1 | 串口工作参数 | MX_USART2_UART_Init |
2 | 底层初始化 | HAL_UART_MspInit |
3 | 开启串口异步接收中断 | HAL_UART_Receive_IT |
4 | 设置优先级,使能中断 | HAL_NVIC_SetPriority / HAL_NVIC_SetPriority |
5 | 编写中断服务函数 | USART2_IRQHandler / HAL_UART_IRQHandler / HAL_UART_RxCpltCallback |
6 | 串口数据发送 | HAL_UART_Transmit |
/* USART2 init function 初始化huart2*/
void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2; //huart2关联实物USART2
huart2.Init.BaudRate = 115200; //波特率115200
huart2.Init.WordLength = UART_WORDLENGTH_8B; //字长8位
huart2.Init.StopBits = UART_STOPBITS_1; //停止位1位
huart2.Init.Parity = UART_PARITY_NONE; // 无校验
huart2.Init.Mode = UART_MODE_TX_RX; //模式 收 和 发
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流控
huart2.Init.OverSampling = UART_OVERSAMPLING_16; //16倍过采样
/*使用 HAL_UART_Init 配置 huart2 */
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
/*以中断方式接收指定字节的数据到缓冲区usart2Buffer*/
HAL_UART_Receive_IT(&huart2,usart2Buffer,1);//打开接收中断
}
/*UART的MSP级初始化*/
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; //GPIO_InitTypeDef结构体GPIO_InitStruct
if(uartHandle->Instance==USART2) //判断参数uartHandle为huart2
{
/* USER CODE BEGIN USART2_MspInit 0 */
/* USER CODE END USART2_MspInit 0 */
/* USART2 clock enable */
__HAL_RCC_USART2_CLK_ENABLE(); //USART2时钟使能
__HAL_RCC_GPIOA_CLK_ENABLE(); //GPIOA时钟使能
/**USART2 GPIO Configuration
PA2 ------> USART2_TX //PA2发送
PA3 ------> USART2_RX //PA3接收
*/
GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; //选择PA2,PA3
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //模式:复用推挽
GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //速度选择
GPIO_InitStruct.Alternate = GPIO_AF7_USART2; //?
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //用GPIO_InitStruct初始化GPIOA
/* USART2 interrupt Init */
HAL_NVIC_SetPriority(USART2_IRQn, 2, 0); //设置USART2优先级2级抢断,0级响应
HAL_NVIC_EnableIRQ(USART2_IRQn); //优先级使能
/* USER CODE BEGIN USART2_MspInit 1 */
/* USER CODE END USART2_MspInit 1 */
}
}
printf重定向
//重定向c库函数printf到串口USART2,重定向后可使用printf函数,为使用printf、scanf函数需要在文件中包含stdio.h头文件
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口USARTx */
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
return (ch);
}
//重定向c库函数scanf到串口USART2,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
int ch;
/* 等待串口输入数据 */
while (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) == RESET);
HAL_UART_Receive(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
return (ch);
}
接收完成回调函数,接收一个字符后发送
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart2,usart2Buffer,1,1000);//发出受到的数据
HAL_UART_Receive_IT(&huart2,usart2Buffer,1);//重新打开接收中断
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!