【STM32】HAL库 串口轮询发送

系列文章目录

【STM32】HAL库 新建MDK工程


前言

使用stm32串口发送打印字符串,重定向printf

一、STM32CubeMX设置

在这里插入图片描述
选择串口1,使用异步模式

二、代码

打印字符串

/* USER CODE BEGIN Includes */
#include "string.h"//使用strlen需要声明
/* USER CODE END Includes */

`/* USER CODE BEGIN PV */
extern UART_HandleTypeDef huart1;
char arr[] = {"hello world\r\n"};//发送的数据
/* USER CODE END PV */``

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		 HAL_UART_Transmit(&huart1,(uint8_t *)arr,strlen(arr),100);
		 HAL_Delay(1000);
  }
  /* USER CODE END 3 */

每次使用 HAL_UART_Transmit 比较麻烦,可以封装一下

void Serial_SendString(char *String)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)String,strlen(String),100);
}

重定向printf

勾选Use McroLIB,添加库
在这里插入图片描述

#include <stdio.h>

int fputc(int ch, FILE  *f)
{
	HAL_UART_Transmit(&huart1, (uint8_t*)&ch ,1,1000);
	
	return (ch);
}

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
//		 HAL_UART_Transmit(&huart1,(uint8_t *)arr,strlen(arr),100);
//		 HAL_Delay(1000);
			
//		 Serial_SendString(arr);
//		 HAL_Delay(1000);
		
		 printf("hello world\r\n");
   		 HAL_Delay(1000);
  }
  /* USER CODE END 3 */
### STM32 HAL 实现串口通信发送 #### 使用 `HAL_UART_Transmit` 函数进行数据传输 为了通过 STM32 的 UART 接口发送数据,可以调用 `HAL_UART_Transmit` 函数。此函数用于阻塞模式下的数据发送操作,在指定的时间内完成给定数量的数据字节传送[^1]。 ```c // 定义要发送的数据缓冲区 uint8_t data_to_send[] = "Hello, World!\r\n"; // 调用 HAL_UART_Transmit 进行数据发送 if (HAL_UART_Transmit(&huart1, data_to_send, sizeof(data_to_send), 0xFFFF) != HAL_OK) { // 如果发生错误,则处理错误情况 } ``` 上述代码片段展示了如何初始化待发送字符串并将其传递给 `HAL_UART_Transmit` 函数执行实际的发送动作。这里假设已经正确配置好了硬件抽象层句柄 `&huart1` 并指定了超时参数作为最后一个输入项。 #### 中断驱动的方式提高效率 除了轮询方法外,还可以采用中断机制来优化性能表现。当启用UART中断后,每当准备就绪时会触发相应的ISR(Interrupt Service Routine),从而减少CPU占用率并加快响应速度[^2]。 对于基于中断的发送过程来说,通常需要先注册回调函数以便于接收到事件通知: ```c void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } /* Enable the UART transmit interrupt */ __HAL_UART_ENABLE_IT(&huart1, UART_IT_TC); } /* UART Transmit Complete callback function */ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART1){ // 当前发送已完成,可在此处放置后续逻辑 } } ``` 这段代码实现了对 USART1 初始化设置以及使能发送完成中断的功能,并定义了一个简单的回调函数用来指示当前帧已成功发出。 #### 实验目的与具体实施步骤说明 本实验旨在熟悉掌握 STM32 HAL 中有关 UART 外设的操作接口及其应用场景;了解如何借助 CubeMX 工具简化项目搭建流程;并通过实践加深理解定时器配合串口使用的技巧[^3]。 在开始之前,请确保已经在 Keil MDK 或其他 IDE 上创建好工程文件,并按照需求完成了必要的外围电路连接工作。接着可以通过如下几个方面来进行更深入的学习探索: - 学习如何使用CubeMX图形界面工具快速生成基础框架; - 尝试修改波特率、校验位等通讯参数观察效果变化; - 结合RTOS操作系统特性进一步提升系统的稳定性和实时性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youuuuvvu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值