stm32cubemx中生成工程的usart1使用printf的兩種方法

stm32cubemx中生成工程的usart1使用printf的兩種方法

最近在從標準庫轉型爲stm32cubemx開發記錄一下遇到的小問題
網上已經有很多相同的printf解決方法了,這裏整理兩種簡單的方法

方法一
1、在生成的usart.c中的/* Includes ------------------------------------------------------------------*/下添加

#include "stdio.h"

不添加會報FILE錯誤
修正內容:測試以後MX重新生成代碼在usart.c的Inlcudes的#include "stdio.h"會被刪除,還是把#include "stdio.h"放在下面/* USER CODE BEGIN 0 */的代碼保護區吧

然後在代碼保護區/* USER CODE BEGIN 0 */添加,不在保護區添加MX生成代碼時會被刪除,也不能自己手動添加保護區

/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
/* With GCC, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
 
 
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART2 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
/* USER CODE END 0 */

2、然後在main.c中的
/* USER CODE BEGIN Includes /
/
USER CODE END Includes */
保護區中添加

#include "stdio.h"

不能添加在/* Includes ------------------------------------------------------------------*/中,重新生成時會被刪除

如果不在main.c下添加的話會報printf錯誤

3、在主函數中循環寫段代碼測試一下

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

    /* USER CODE BEGIN 3 */
		HAL_Delay(1000);
		printf("123!\r\n");
  }
  /* USER CODE END 3 */

這裏就不截圖了,實際已經在串口助手成功打印了

還有第二種printf的方法比較方便簡單
方法二
這裏提供了一種和網上不一樣的printf使用方法,咱也是學習來的這裏記錄一下
生成工程以後不用處理usart.c,直接在main.c中的保護區添加代碼
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* USER CODE BEGIN PD */

  #define printf1(...) HAL_UART_Transmit(&huart1,\

 										(uint8_t *)u_buf,\

										sprintf((char*)u_buf,__VA_ARGS__),\

										0xffff)

/* USER CODE END PD */

然後還是在main.c的保護區要定義一下u_buf的數組

 /* USER CODE BEGIN PV */
 uint8_t u_buf[256];
 /* USER CODE END PV */

之後我們就可以在主函數中使用了,來測試一下
這裏主要調用的時候用的是printf1,而不是printf

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

    /* USER CODE BEGIN 3 */
        HAL_Delay(2000);
        printf1("123456789");
  }
  /* USER CODE END 3 */

結果串口助手成功打印,完結。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章