STM32串口数据收发基础

本文介绍了STM32芯片中串行接口的原理、异步串行通信,重点讲解了HAL库中的串口发送和接收函数,以及一个实际案例,包括发送和接收数据、LED控制及中断回调的实现。
摘要由CSDN通过智能技术生成

1、串行接口相关知识点

  1. 并行通讯、串行通讯。

  2. 单工、半双工(RS485)、全双工。

  3. 异步串行通信:通信双方在没有同步时钟的前提下,将一个字符(包括特定的附加位)按位进行传输的通信方式。

  4. 波特率:每秒钟传输的二进制位数,如9600bps。

  5. TTL电平<—->RS232:MAX3232 SP3232 串口<———>USB接口:CH340 CP2012

STM32芯片的串口UASRT功能十分强大,但对于日常编程而言,使用最多的还是异步串行通信。

  • 串口1:USART1TXPA9复用,USART1RXPA10复用。

  • 串口2:USART2TXPA2复用,USART2RXPA3复用。

2、HAL库中串口发送的重要函数

/*阻塞式发送函数*/
HAL_StatusTypeDef  HAL_UART_Transmit(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size, uint32_t Timeout);
/*	参数1:huart,串口实例的指针。
	参数2:*pData,待发送数据缓冲区的指针。
	参数3:Size,待发送数据的字节数。
	参数4:Timeout,超时时间值。
	返回值:HAL_StatusTypeDef,函数执行状态。*/

/*非阻塞式发送函数*/
HAL_StatusTypeDef  HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size);
/*	参数1:huart,串口实例的指针。
	参数2:*pData,待发送数据缓冲区的指针。
	参数3:Size,待发送数据的字节数。
	返回值:HAL_StatusTypeDef,函数执行状态。*/

串口发送完毕中断回调函数  
void HAL_UART_TxCpltCallback(UART_HandleTypeDef  *huart);					//常用
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef  *huart)
    

3、HAL库中串口接收的重要函数

HAL_StatusTypeDef  HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData,  uint16_t Size, uint32_t Timeout);
/*	参数1:huart,串口实例的指针。
	参数2:*pData,数据接收据缓冲区的指针。
	参数3:Size,待接收数据的字节数。
	参数4:Timeout,超时时间值。
	返回值:HAL_StatusTypeDef,函数执行状态。*/

//非阻塞式接收函数(推荐使用)
HAL_StatusTypeDef  HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size);
 /* 参数1:huart,串口实例的指针。
    参数2:*pData,数据接收据缓冲区的指针。
    参数3:Size,待接收数据的字节数。
    返回值:HAL_StatusTypeDef,函数执行状态。*/

串口接收完毕中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart);
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef  *huart);

4、案例

【1】开机后,向串口1发送“hello world!”。

【2】串口1收到字节指令“0xA1”,打开LED1,发送“LED1 Open!”。

【3】串口1收到字节指令“0xA2”,关闭LED1,发送“LED1 Closed!”。

4.1、宏定义:

/*宏定义参数*/
uint8_t TX_str1[]="hello word!\r\n";
uint8_t TX_str2[]="led1 no!\r\n";
uint8_t TX_str3[]="led1 yes!\r\n";
uint8_t TR_dat= 0;

/*宏定义引脚*/
#define led1_on() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET);  
#define led1_off() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_RESET);  
#define led2_on() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);  
#define led2_off() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);  

4.2、重写串口接收完毕中断回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)
{
    if (huart->Instance ==USART1)
    {
      if (TR_dat == 0XA1)
      {
          led1_on();
		  
          led2_on();                                                 //打开灯
          HAL_UART_Transmit(&huart1,TX_str2,sizeof(TX_str2),10000);    
          led2_off();    
		  HAL_UART_Receive_IT(&huart1,&TR_dat,1);
      }
      else if (TR_dat==0XA2)
      {
          led1_off();
          led2_on();                                                 //打开灯
          HAL_UART_Transmit(&huart1,TX_str3,sizeof(TX_str3),10000);    
          led2_off();    
		  HAL_UART_Receive_IT(&huart1,&TR_dat,1);
      }
       
      
    }
    
}

4.3、在mian()函数中添加以下代码:

MX_GPIO_Init();                             //端口初始化
  MX_USART1_UART_Init();                      //串口初始化
  /* USER CODE BEGIN 2 */
  /*通过串口向电脑发送halle word*/
  led2_on();                                                 	//打开灯
  HAL_UART_Transmit(&huart1,TX_str1,sizeof(TX_str1),1000);    	//通过从串口发送hello word
  led2_off();                                                  	//关闭灯
  
  //通过电脑串口助手向单片机发送控制指令
  /*串口1收到字节指令“0xA1”,打开LED1,发送“LED1 Open!”。
    串口1收到字节指令“0xA2”,关闭LED1,发送“LED1 Closed!”。*/
    HAL_UART_Receive_IT(&huart1,&TR_dat,1);						//此函数的作用在回调函数中查看
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值