基於STM32之UART串口通信協議(四)Printf發送


一、前言

1、簡介

  前面在UART發送中已經講解過如何調用HAL庫的HAL_UART_Transmit函數來實現串口發送,而在調用這個函數來實現串口發送的話,但是在發送數據或者字符的時候,需要將數據或字符都先轉換成字符並存在一個數組,或者分開發幾次,這是會出現一些不便之處,不能像printf一樣方便。

  所以這篇博客就說說如何在串口上實現用printf函數來發送,實現方法也非常簡單。

2、UART簡介

  嵌入式開發中,UART串口通信協議是我們常用的通信協議之一,全稱叫做通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter)。

3、准備工作

  按照UART詳解中完成所有配置操作並生成代碼,就可以開始下面操作。

二、代碼部分

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、編譯、下載燒寫

7、實現效果

說明:

  按照上面的操作完成后,就可以在串口發送上實現printf的發送功能,非常方便使用。

三、結尾

 1、總結

  這篇博客補全了 未提及的Printf發送方式,我們可以將這兩個代碼文件保存下來,日后可以直接在其他項目調用即可。

2、回顧

1)UART詳解

2)UART發送

3)UART接收

3、后續

待補充……

~

~

~

~

感謝閱讀~

 歡迎大家關注我的博客,一起分享嵌入式知識~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM