自定义发送映射代码:
int fputc(int ch, FILE *f)
{
Serial_SendByte(ch); //将printf的底层重定向到自己的发送字节函数
return ch;
}
/**
* 函 数:自己封装的prinf函数
* 参 数:format 格式化字符串
* 参 数:... 可变的参数列表
* 返 回 值:无
*/
void Serial_Printf(char *format, ...)
{
char String[100]; //定义字符数组
va_list arg; //定义可变参数列表数据类型的变量arg
va_start(arg, format); //从format开始,接收参数列表到arg变量
vsprintf(String, format, arg); //使用vsprintf打印格式化字符串和参数列表到字符数组中
va_end(arg); //结束变量arg
Serial_SendString(String); //串口发送字符数组(字符串)
}
va_:
va_
不是一个单一的变量类型,而是与C语言中的可变参数(variadic arguments)处理相关的一系列宏和类型的前缀。在C语言中,当函数需要接受不定数量的参数时,可以使用可变参数列表。为了处理这些可变参数,C标准库提供了一组宏和类型定义,在<stdarg.h>
头文件中声明。
以下是与va_
相关的几个关键组件:
va_list
类型:- 这是一个用于遍历可变参数列表的指针类型。
- 在函数中,通常会定义一个
va_list
类型的变量,以便访问和处理可变参数。
va_start
宏:- 用于初始化
va_list
变量,使其指向可变参数列表的第一个参数。 - 宏的第二个参数是最后一个固定参数(即可变参数之前的参数),用于确定可变参数列表的起始位置。
- 用于初始化
va_arg
宏:- 用于从
va_list
变量中获取当前参数的值,并将其类型转换为指定的类型。 - 每次调用
va_arg
后,va_list
变量会自动更新,指向下一个参数。
- 用于从
va_end
宏:- 用于清理
va_list
变量,结束对可变参数列表的访问。 - 通常将
va_list
变量重置为NULL或进行其他适当的清理操作。
- 用于清理