基于stm32cubemx的串口重定向printf实现

/* USER CODE BEGIN 0 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

/* USER CODE END 0 */

此段代码实现的是宏定义PUTCHAR_PROTOTYPE。理解该宏定义需要了解#ifdef GNUC,它是一个编译器预定义宏,通常用来判断编译器类型,而GNU GCC编译器通常为开源的。通过MDK-ARM的“help”菜单可以了解到,MDK-ARM使用的编译器是ARMcc.exe,因为这里有效的语句为:

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

在/* USER CODE BEGIN 4 /和/ USER CODE END 4 */之间补充如下源代码:

/* USER CODE BEGIN 4 */
PUTCHAR_PROTOTYPE
{
	//阻塞式发送
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
/* USER CODE END 4 */

乍一看,这部分代码好像没有函数名字,根据第一段代码的理解,这部分代码的函数名字应该为int fputc(int ch, FILE *f)。这段代码就是通过对库函数fputc的重新定义,且在fputc函数中调用HAL_UART_Transmit函数来实现库函数fputc的重定向(库函数printf内部要调用fputc函数)。
最后在再引入头文件stdio.h,就可以再main.c函数处使用printf函数并通过串口打印信息了。例如:

/* USER CODE BEGIN WHILE */
  while (1)
  {
		printf("小测试\r\n");
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

【注意】c语言中,\r是回车符(Retrun),\n是换行符(Newline)。windows系统下,要实现换行符操作,其实是两个动作:先回车,再换行。故要使用\r\n。Linux系统下的程序只使用\n就可以进行换行输出。
最后还得把头文件stdio.h包含进来。

#include "stdio.h"

更改完之后在keil 平台上改下设置:
Use MicroLIB ->Target -> Code Generation -> 选中Use MicroLIB
一定要勾上Use MicroLIB,否则printf不了!!!
基于stm32cubemx的串口重定向printf实现_第1张图片

你可能感兴趣的:(stm32,c语言)