目录
一、基本知识
二、HAL库中串⼝发送的重要函数及逻辑
1.1阻塞式发送函数
HAL_StatusTypeDef HAL_UART_Transmit()
发送完成后此函数才执行,未发送完成时,单片机不能做其他事情
1.2非阻塞式发送函数
HAL_StatusTypeDef HAL_UART_Transmit_IT()
发送完成后的回调函数
void HAL_UART_TxCpltCallback()
发送内容完成后进入发送中断,调用发送完成后的回调函数
优点在于若发送的信息较多,直接进入发送中断的回调函数进行处理,不影响单片机做其他工作
2.1阻塞式接收函数
HAL_StatusTypeDef HAL_UART_Receive()
2.2 非阻塞式接收函数
⾮阻塞式接收函数
HAL_StatusTypeDef HAL_UART_Receive_IT()
接收完毕中断回调函数
void HAL_UART_RxCpltCallback()
注意:主要注意的地点是在使⽤中断回调函数后,如果后续还需要继续调⽤中断,则需
要在回调函数中重新调⽤HAL_StatusTypeDef HAL_UART_Receive_IT()
三、案例
1.发送hello world
2.通过串口收发显示数据,发送1,控制LED灯亮,输出 LED open
3.通过串口收发显示数据,发送2,控制LED灯灭,输出 LED off
4,用Proteus进行模拟
代码 :
//定义字符数组
uint8_t TX1[]="hello world!\r\n";
uint8_t TX2[]="\r\nLED open\r\n";
uint8_t TX3[]="\r\nLED closed\r\n";
uint8_t Rx_data[1];
//定义灯开关的宏
#define LEDon() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
#define LEDoff() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
//非阻塞式接收的回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//判断是否为USART1(应用于通信接口的外设,被定义为实例)
if(huart->Instance==USART1)
{
if(Rx_data[0]=='1')
{
LEDon();
HAL_UART_Transmit(&huart1,TX2,sizeof(TX2),10000);
HAL_UART_Receive_IT(&huart1,Rx_data,1);//注意点:勿忘再次接收,这样才能继续回调,使通信继续进行下去
}
else if(Rx_data[0]=='2')
{
LEDoff();
HAL_UART_Transmit(&huart1,TX3,sizeof(TX3),10000);
HAL_UART_Receive_IT(&huart1,Rx_data,1);
}
}
}
//main函数中
//阻塞式串口发送
HAL_UART_Transmit(&huart1,TX1,sizeof(TX1),10000); //向上位机发送“hello world!”
//非阻塞式串口接收,然后进行上面定义的相应回调函数
HAL_UART_Receive_IT(&huart1,Rx_data,1);启动串口1接收上位机1个字节
模拟:
stm32小白一枚~如有不对,望指正,欢迎一起交流沟通~~