stdarg宏与实现stm32printf串口打印

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);
上一篇:C和C指针小记(十一)-函数的可变参数表


下一篇:CircleImageView自定义圆形控件的使用