int fputc(int ch, FILE *f)
{
unsigned char temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, 1, 0xFFFF);
return ch; // 或者返回 0,表示写入成功
}
标准库中的 printf
函数在执行输出时会调用 fputc
函数,将字符一个个发送到输出流中。通过重写 fputc
函数,你可以改变字符的输出方式,比如将字符通过 UART 发送出去,而不是输出到标准输出流(比如终端窗口)。
在代码中,直接调用 printf(ch)
并不会让你看到 fputc
函数被多次调用的过程,因为这个过程是在标准库中进行的,是隐藏在 printf
函数的内部实现中的。
所以,虽然在你的代码中你看不到 fputc
函数被多次调用的过程,但在 printf(ch)
执行的过程中,fputc
函数会被多次调用来完成字符的输出。
main函数里:
unsigned char ch[20] = {0};
HAL_UART_Transmit(&huart1, "hello world\n", strlen("hello world\n"), 100);
while(1)
{
HAL_UART_Receive(&huart1, ch, 19, 100);
//HAL_UART_Transmit(&huart1, ch, strlen(ch), 100);
printf(ch);
memset(ch, 0, strlen(ch));
}
所以虽然ch数组大小为20个字节,但是printf会多次调用fputc,一个一个字节传过去。
最后别忘了勾选Micro LIB库,不然printf无法重映射。