基于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函数功能