使用Stm32CubeMX生成的Makefile工程,编译器使用arm-none-eabi-gcc,使用printf打印调试信息时遇到问题,不能正常通过串口输出。
查询资料,重定义_write()。
int _write(int fd, char *ch, int len)
{
HAL_UART_Transmit(&huart1, (uint8_t*)ch, len, 0xFFFF);
return len;
}
测试依旧不能正常。
多次查询,终于在st论坛上找到蛛丝马迹。
Thank you! I was pulling my hair out trying to override __io_putchar() and _write() and fputc() and not seeing any of those functions getting called by printf(). Adding fflush(stdout) made it work.
后经查询,fflush()用于清空缓冲区。
printf 这样的函数不是直接打印到屏幕上的,而是先放在一个缓冲区中(stdout)中。如果收到了一个换行符,就会把这个缓冲区的内容打印到屏幕上,并清空。而 fflush 的作用就是直接把缓冲区的内容打印到屏幕上,并清空缓冲区。不必等换行符。
测试,当printf("message\r\n");同样会输出显示。
printf("Test\r\n");
printf("Test2");
fflush(stdout);
uint8_t tx_buf[]="hello";
HAL_UART_Transmit(&huart1,tx_buf,5,0xFFFF);