【单片机】基于STM32的UART串口通信--printf发送

文章介绍了如何在STM32项目中通过UART串口实现printf函数的功能,以更方便地进行串口数据发送。通过创建自定义的“.c”和“.h”文件,重定义fputc函数,并配置HAL库,使得printf可以直接将数据通过UART发送出去,无需预先构建字符数组。
摘要由CSDN通过智能技术生成

基于STM32的UART串口通信



一、前言

1、简介

前面在UART发送中已经讲解过如何调用HAL库的HAL_UART_Transmit函数来实现串口发送,而在调用这个函数来实现串口发送的话,但是在发送数据或者字符的时候,需要将数据或字符都先转换成字符并存在一个数组,或者分开发几次,这是会出现一些不便之处,不能像printf一样方便。

所以这篇博客就说说如何在串口上实现用printf函数来发送,实现方法也非常简单。

2、UART简介

嵌入式开发中,UART串口通信协议是我们常用的通信协议之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。


二、代码部分

1、创建新的“.c”、“.h”文件(命名按照自己习惯)

2、在“.h”文件中添加(最后需要空出一行)

1 #ifndef _CORE_PRINTF_H_
 2 #define _CORE_PRINTF_H_
 3 
 4 #include "stdio.h"
 5 #include "Usart.h"
 6 
 7 
 8 
 9 
10 
11 
12 #endif

3、在“.c”文件中添加(最后需要空出一行)

1 #include "Core_Printf.h"
 2 
 3 
 4 
 5 #if 1
 6 #pragma import(__use_no_semihosting)             
 7 /* 标准库需要的支持函数 */              
 8 struct __FILE 
 9 { 
10     int handle; 
11 }; 
12 
13 FILE __stdout;       
14 /* 定义_sys_exit()以避免使用半主机模式     */
15 void _sys_exit(int x) 
16 { 
17  x = x; 
18 } 
19 /* 重定义fputc函数 */
20 int fputc(int ch, FILE *f)
21 {
22     /* 选择USART1发送 */
23     while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
24     USART1->DR = (uint8_t) ch;
25     return ch;
26 }
27 #endif

4、添加Include头文件(在需要调用到的函数中添加)

1 /* USER CODE BEGIN Includes */
2 #include "Core_Printf.h"
3 /* USER CODE END Includes */

5、整个main函数如下

 1 int main(void)
 2 {
 3   /* USER CODE BEGIN 1 */
 4     
 5   /* USER CODE END 1 */
 6   
 7 
 8   /* MCU Configuration--------------------------------------------------------*/
 9 
10   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
11   HAL_Init();
12 
13   /* USER CODE BEGIN Init */
14 
15   /* USER CODE END Init */
16 
17   /* Configure the system clock */
18   SystemClock_Config();
19 
20   /* USER CODE BEGIN SysInit */
21 
22   /* USER CODE END SysInit */
23 
24   /* Initialize all configured peripherals */
25   MX_GPIO_Init();
26   MX_USART1_UART_Init();
27   /* USER CODE BEGIN 2 */
28 
29   /* USER CODE END 2 */
30 
31   /* Infinite loop */
32   /* USER CODE BEGIN WHILE */
33   while (1)
34   {
35         /* UART printf发送 */
36         printf("\r\n欢迎来到LLLIN000的博客!!");
37         /* 延迟1s */
38         HAL_Delay(1000);
39     /* USER CODE END WHILE */
40 
41     /* USER CODE BEGIN 3 */
42   }
43   /* USER CODE END 3 */
44 }

6、编译下载烧写即可实现printf函数功能

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值