在 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;
}
逻辑分析仪采样结果如下:

二、问题分析
由于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);
四、实验效果


浙公网安备 33010602011771号