stdarg宏与实现stm32printf串口打印
stdarg宏
包括
一个数据类型:va_list
三个宏:va_start、va_arg、va_end
/* 函数用于计算平均数
n_values:表示总共几个数
...:表示需要计算的数
*/
float average(int n_values, ...)
{
int sum = 0;
va_list arg;
/* 第一个参数是va_list变量,
第二个是可变参数的前一个参数 。
初始化过程,会把arg变量设置为
指向可变参数部分(也就是 ... 部分)第一个输入参数
arg可看作参数列表 */
va_start(arg, n_values)
for(int i = 0; i < n_values; i++)
{
/* va_arg会接收两个参数,va_list变量
和参数列表中下一个参数的类型。
va_arg返回这个参数的值,并使arg指向
下一个可变参数 */
sum += va_arg(arg,int);
}
/* 可变参数访问完毕后,释放arg */
va_end(arg);
return sum / n_values;
}
实现串口打印
void vprint(const char *fmt, va_list argp)
{
unsigned char string[200];
if(0 < vsprintf(string,fmt,argp)) // build string
{
HAL_UART_Transmit(&huart1, string, strlen(string), 0xffffff); // send message via UART
}
}
void u_print(const char *fmt, ...) // custom printf() function
{
va_list argp;
va_start(argp, fmt);
vprint(fmt, argp);
va_end(argp);
}
/* 正常情况下返回生成字串的长度
把参数 param 按照 *format 指定的格式 写到 *string */
int vsprintf(char *string, char *format, va_list param);