stm32HAL库实现串口收发数据

本文详细介绍了如何在STM32开发中利用HAL库进行串口数据的发送与接收,包括非中断模式下的操作,以及启用中断进行异步数据传输,同时涉及GPIO控制和系统时钟配置示例。
摘要由CSDN通过智能技术生成

1.HAL库串口发送接送数据

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力

  • 简单的串口连接方式用一个设备的TX(发送数据端)连接另一台设备的RX(接受数据端),由此交叉相连
1.串口接发数据(非中断模式)
  1. 配置所使用的串口外设,在此我使用的串口外设是USART1其他资源按需求配置在这里插入图片描述

  2. 配置时钟等(时钟树按照自己需要配置即可)

  3. 发送数据与接受数据的实现

    //发送数据函数
    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
    
    • UART_HandleTypeDef *huart:这里需要你传入你要使用的huart外设的地址
    • const uint8_t *pData:你要写入数据的地址
    • uint16_t Size:写入数据的大小
    • uint32_t Timeout:规定运行时间
    //发送数据函数
    HAL_StatusTypeDef HAL_UART_Transmit(&huart1,"hello_this_is_urast_text\r\n",strlen("hello_this_is_urast_text\r\n"),100)
    //此时在程序中就完成了一个字符串的发送
    

//接受数据函数
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  • ​ UART_HandleTypeDef *huart:这里需要你传入你要使用的huart外设的地址
  • const uint8_t *pData:你要将读取的数据放入的地址
  • uint16_t Size:读取数据的长度
  • uint32_t Timeout:规定运行时间
HAL_UART_Receive(&huart1,ch,20,100);
//这样就读取到了一个数据

4.完整功能实现

//开启小灯
void LED_ON()
{
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET);
}

//关闭小灯
void LED_Close()
{
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET);
}


/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
	unsigned char ch[20] = {0};
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	
	//上电后发送一个发送成功的标志以判断串口是否打开成功
	HAL_UART_Transmit(&huart1,(const uint8_t *)"blueteeth_open\n",strlen("blueteeth_open\n"),100);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_UART_Receive(&huart1,ch,20,100);
		HAL_UART_Transmit(&huart1,ch,strlen((const char *)ch),100);
		if(!strcmp((const char *)ch,"open"))
		{
			LED_ON();
			HAL_UART_Transmit(&huart1,(const uint8_t *)"LED_OPEN\n",strlen((const char *)"LED_OPEN\n"),100);
		}
		else if(!strcmp((const char *)ch,"close"))
		{
			LED_Close();
			HAL_UART_Transmit(&huart1,(const uint8_t *)"LED_CLOSE\n",strlen((const char *)"LED_CLOSE\n"),100);
		}
		else
		{
			if(ch[0] != '\0')
			{
				HAL_UART_Transmit(&huart1,(const uint8_t *)"LED_ERR\n",strlen((const char *)"LED_ERR\n"),100);
			}
		}
      //这里必须清空否者会无线循环打印接受到的第一个数据
		memset(ch, 0, strlen((const char *)ch));
		
			
		 
  }
  /* USER CODE END 3 */
}
1.串口接发数据(非中断模式)
  1. 初始配置和非中断模式一样只是多了一个打开中断的步骤,需要在CUBMAX中配置NVIC打开串口中断在这里插入图片描述

  2. 代码实现

    • 中断发送函数

      void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
      {
      	if(huart->Instance==USART1)
      	{
      		HAL_UART_Transmit(&huart1,"IT_SEND\r\n",strlen("IT_SEND\r\n"),100);
      	}
      }
      
    • 中断接受函数

      void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
      {
      	if(huart->Instance==USART1)
      	{
      		HAL_UART_Transmit(&huart1,"receive\r\n",strlen("receive\r\n"),100);
      		HAL_UART_Receive_IT(&huart1,(uint8_t *)buff,4);
      	}
      }
      
      
      int main(void)
      {
        /* USER CODE BEGIN 1 */
        /* USER CODE END 1 */
      
        /* MCU Configuration--------------------------------------------------------*/
      
        /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
        HAL_Init();
      
        /* USER CODE BEGIN Init */
      
        /* USER CODE END Init */
      
        /* Configure the system clock */
        SystemClock_Config();
      
        /* USER CODE BEGIN SysInit */
      
        /* USER CODE END SysInit */
      
        /* Initialize all configured peripherals */
        MX_GPIO_Init();
        MX_USART1_UART_Init();
        /* USER CODE BEGIN 2 */
      	
      	//发送数据22
      	HAL_UART_Transmit_IT(&huart1,(const uint8_t *)"usart_it_sent\r\n", strlen("usart_it_sent\r\n"));
      	
      	//接受数据
      	HAL_UART_Receive_IT(&huart1,(uint8_t *)buff,4);
      	
        /* USER CODE END 2 */
      
        /* Infinite loop */
        /* USER CODE BEGIN WHILE */
        while (1)
        {
          /* USER CODE END WHILE */
      
          /* USER CODE BEGIN 3 */
        }
        /* USER CODE END 3 */
      }
      

      这里实现的是我们发送一个数据时就会进入中断,发送一个IT_Send;当接受到数据时,会进入中断并且再次打开中断接受使能,让数据进入到BUFF

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值