代码
/**
* 函 数:重定向 printf 的底层函数,然后就可以在源文件中调用 printf 了
* 参 数:保持原始格式即可,无需变动
* 返 回 值:保持原始格式即可,无需变动
// 重定向 fputc 跟 printf 的关系,fputc 是 printf 的底层,printf 函数在不断打印的时候,就是不断调用 fputc 函数一个个打印,我们把 fputc 函数重定向到串口,那 printf 自然就输出到串口了。
/
int fputc(int ch, FILE f) // 这是 fputc 函数原型
{
Serial_SendByte (ch); // 将 printf 的底层重定向到自己的发送字节函数
return ch;
}
/
* 函 数:自己封装的 prinf 函数,代码中调用Serial_Printf来代替调用printf函数
* 参 数:format 格式化字符串
* 参 数:... 用来接收后面的可变的参数列表
* 返 回 值:无
*/
void Serial_Printf (char *format, ...)
{
char String [100]; // 定义字符串
va_list arg; // 定义可变参数列表数据类型的变量
va_start (arg, format);
vsprintf (String, format, arg);
va_end (arg);
Serial_SendString (String); // 串口发送 String
}
STM32 串口两套打印实现完整解析
两套方案,都实现串口打印,底层原理完全不一样:
fputc重定向 → 标准库printf()Serial_Printf自己封装可变参数 → 自定义打印函数
第一部分:fputc 重定向,对接系统 printf
int fputc(int ch, FILE *f)
{
Serial_SendByte(ch);
return ch;
}
fputc 和 printf 的关系
C 标准库里面: printf()本身不会直接输出,printf 底层循环调用fputc(),每输出 1 个字符,就调用一次fputc输出这个字符。
例如:
printf("AB");
- printf 先处理格式化,得到字符
'A'、'B'


1万+

被折叠的 条评论
为什么被折叠?



