stm32cubemx中生成工程的usart1使用printf的两种方法
程序员文章站
2022-06-08 20:57:05
...
stm32cubemx中生成工程的usart1使用printf的两种方法
最近在从标准库转型为stm32cubemx开发记录一下遇到的小问题
网上已经有很多相同的printf解决方法了,这里整理两种简单的方法
方法一
1、在生成的usart.c中的/* Includes ------------------------------------------------------------------*/下添加
#include "stdio.h"
不添加会报FILE错误
然后在代码保护区/* USER CODE BEGIN 0 */添加,不在保护区添加MX生成代码时会被删除,也不能自己手动添加保护区
/* USER CODE BEGIN 0 */
#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中的/* Includes ------------------------------------------------------------------*/下也同样添加
#include "stdio.h"
如果不在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 */
结果串口助手成功打印,完结。
上一篇: 关于调试输出printf移植问题