STM32之串⼝通讯---串⼝数据收发 USART

目录

一、基本知识

二、HAL库中串⼝发送的重要函数及逻辑

1.1阻塞式发送函数

1.2非阻塞式发送函数

2.1阻塞式接收函数 

2.2 非阻塞式接收函数

三、案例


一、基本知识

 

二、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小白一枚~如有不对,望指正,欢迎一起交流沟通~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值