使用STM32CubeMX生成的Makefile工程中使用printf函数在串口打印输出的问题

Created: March 18, 2023 9:04 AM
Created by: Luser
Type: AI

在工程中引入printf输出函数的曲线方法—重定义一个输出函数

在使用STM32CubeMX生成的makefile工程中,需要进行一些配置才能使用printf函数。具体步骤如下:

  1. 确保你的代码中包含了stdio.h头文件,它包含了printf函数的定义和相关宏定义。

  2. 在代码中添加如下语句:

#include <stdio.h>
#include <stdarg.h>
void USART_Printf(const char *format, ...) {
  char buffer[100];
  va_list args;
  va_start(args, format);
  vsnprintf(buffer, sizeof(buffer), format, args);
  HAL_UART_Transmit(&huart1, (uint8_t *) buffer, strlen(buffer), HAL_MAX_DELAY);
  va_end(args);
}

该函数将printf格式化字符串中的内容通过串口输出。当你需要输出printf格式化字符串中的内容时,调用该函数即可:

USART_Printf("Hello, world! x = %d\n", x);

其中,USART_Printf函数可以根据实际情况修改,比如修改串口句柄为你所使用的串口句柄。

对于USART_Printf函数不能正常输出long long 类型变量的问题

USART_Printf函数是一个串口打印输出函数,它是基于printf函数实现的。对于long long类型的变量,在使用printf函数输出时,需要使用"%lld"格式字符串。但是,在某些编译器中,"%lld"格式字符串可能不被支持,导致输出异常。

为了解决这个问题,可以使用以下两种方法:

  1. 使用"%ld"格式字符串输出long long类型的变量。"%ld"格式字符串用于输出长整型变量,可以兼容long long类型的变量。例如:
long long x = 1234567890123;
USART_Printf("x = %ld\n", x);
  1. 将long long类型的变量拆分成两个int类型的变量进行输出。例如:
long long x = 1234567890123;
USART_Printf("x = %ld%ld\n", (int)(x >> 32), (int)(x & 0xFFFFFFFF));

这种方法将long long类型的变量分为高32位和低32位两个int类型的变量进行输出。注意,使用这种方法时需要确保long long类型的变量不会溢出int类型的范围。