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 */
可以看到在串口助手打印了数据
这里就不解释代码的意思了,主要是简单的使用