在 STM32 中,使用重定向 printf 函数做串口输出。打印字符串过程中,每个字符中间多了 3 个 NULL 字符的问题。

一、问题描述
在 STM32 中,使用重定向 printf 函数做串口输出。打印字符串过程中,每个字符中间多了 3 个 NULL。

重定向代码:

#ifdef _GNUC_
  #define PUTCHAR_PROTOTYPE int _io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *f)
#endif

PUTCHAR_PROTOTYPE{
  HAL_UART_Transmit(&huart1,(uint8_t *)&ch,sizeof(ch),0xFFF);
  return ch;
}

逻辑分析仪采样结果如下:
image

二、问题分析
由于printf函数是将char数组一位一位传入,传入形式为int形式。故而在传入一个char变量后,printf进行强制类型转换后,填充了3个null。

int的大小由编译器和目标平台决定,但在常见的 32 位和 64 位 Windows 环境下,编译器(如 MSVC、GCC/MinGW)都将其实现为 4 字节。
因此,在stm32中int占四个字节(32位),sizeof结果为4。HAL_UART_Transmit刚好将3个NULL也打印了出来。

三、解决办法
将HAL_UART_Transmit中的数据长度改为1。

  HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFF);

四、实验效果
image

posted @ 2026-02-22 20:49  alanala  阅读(1)  评论(0)    收藏  举报