MX生成的HAL庫代碼沒有printf,如果需要使用的話需要把標准庫里的回調函數移植過去,網上已經提供了很多教程這里整理一下兩種方法
方法一
1、在生成的usart.c中的/* Includes ------------------------------------------------------------------*/下添加
#include "stdio.h"
不添加stdio.h會報FILE錯誤
————————————————————————————————————————
在測試過程中MX重新生成代碼會刪除usart.c中的#include "stdio.h"
把#include "stdio.h"添加到/* USER CODE BEGIN 0 */保護區就行了
————————————————————————————————————————
然后在usart.c代碼保護區/* USER CODE BEGIN 0 */添加,不在保護區添加MX生成代碼時會被刪除,也不能自己手動添加保護區

1 /* USER CODE BEGIN 0 */ 2 #ifdef __GNUC__ 3 /* With GCC, small printf (option LD Linker->Libraries->Small printf 4 set to 'Yes') calls __io_putchar() */ 5 #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) 6 #else 7 #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) 8 #endif /* __GNUC__ */ 9 10 11 PUTCHAR_PROTOTYPE 12 { 13 /* Place your implementation of fputc here */ 14 /* e.g. write a character to the USART2 and Loop until the end of transmission */ 15 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); 16 17 return ch; 18 } 19 /* USER CODE END 0 */
2、處理完usart.c以后我們回到mian.c中也在
————————————————————————————————————————
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */保護區中添加#include "stdio.h"
————————————————————————————————————————
不能添加在/* Includes ------------*/下,MX重新生成工程時會被刪除
這里不添加會報printf錯誤
然后我們就可以在main中使用printf了
在while中寫個代碼測試一下

1 /* USER CODE BEGIN WHILE */ 2 while (1) 3 { 4 /* USER CODE END WHILE */ 5 6 /* USER CODE BEGIN 3 */ 7 HAL_Delay(1000); 8 printf("123!\r\n"); 9 } 10 /* USER CODE END 3 */
這里就不截圖串口助手中的圖片了,效果是1秒打印次
方法二
這里提供了一種和網上不一樣的printf使用方法,咱也是學習來的這里記錄一下
生成工程以后在mian.c的保護區
/* USER CODE BEGIN PD */
/* USER CODE END PD */
中間添加

1 /* USER CODE BEGIN PD */ 2 3 #define printf1(...) HAL_UART_Transmit(&huart1,\ 4 5 (uint8_t *)u_buf,\ 6 7 sprintf((char*)u_buf,__VA_ARGS__),\ 8 9 0xffff) 10 11 /* USER CODE END PD */
還要在
/* USER CODE BEGIN PV */
/* USER CODE END PV */
中間定義u_buf才可以使用

1 /* USER CODE BEGIN PV */ 2 uint8_t u_buf[256]; 3 /* USER CODE END PV */
注意這里定義的和普通的printf多了一個1,是printf1
我們在下面mian函數的循環里面調用一下測試

1 /* USER CODE BEGIN WHILE */ 2 while (1) 3 { 4 /* USER CODE END WHILE */ 5 6 /* USER CODE BEGIN 3 */ 7 HAL_Delay(2000); 8 printf1("123456789"); 9 } 10 /* USER CODE END 3 */
可以看到在串口助手打印了數據
這里就不解釋代碼的意思了,主要是簡單的使用