完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
引入:最近在移植MPU6050的DMP库的时候遇到了许多问题,其驱动代码中有关打印日志的部分让我印象深刻,他的传参格式和printf很像,包括在做其他驱动移植参考别人的移植代码时,别人的串口输出函数也是用的printf关键字。这种传参方式在参数格式多变,数量多变的情况下着实有用。 这里我们先来了解一下传统printf函数的代码。。 int printf(const char *format, ...) { va_list L; //生成栈 int count=0; //用于记录参数个数 va_start(L,format);//指向栈中的第一个数据 (获取首指针) count=vprintf(format,L);//轮询打印 va_end(L); //结束栈(清除) return count; } 从这段代码中可以知道: 不定参函数的定义格式 : 类型 函数名(参数,...){代码段;} 代码段是一堆用于处理参数的宏定义和一个返回值(这里用于返回参数个数)组成。 对于不定参函数最重要的宏命令有这三个:va_list , va_start , va_end 。
除去这三个,还有一些就是用于处理列表的函数了。比如,va_arg,vsprintf等。举个例子,试试下面这个函数。 int sum(int number,...) { int s=0; va_list L; va_start(L,number); while( number--) s=s+va_arg(L,int); va_end(L); return s; } 不难看出这是一个任意个数整数求和的函数。我们发现这里的形参number是一个整型,指的是后面参数的个数。结合printf那个例子中的format,我们可以得出:不定参函数必须传入至少一个形参,用于修饰后面的不定参数。 那么在STM32中,则有 int USART_Printf(const char *format,...) { __va_list L; char str[64]; //用于存放输出结果 __va_start(L,format); vsprintf(str,format,L); //格式转换 Usart_SendString(USART1,str);//默认使用串口1 __va_end(L); } int OLED_Printf(const char *format,...) { __va_list L; char str[64]; //用于存放输出结果 __va_start(L,format); vsprintf(str,format,L); //格式转换 OLED_ShowString(0,0,str,20);//默认打印位置(x=0,y=0,str,字号20) __va_end(L); } vsprintf函数可以参考sprintf,更多关于va_list数据格式的操作函数可以自己去标准库里找。 |
||
|
||
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1117 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1143 浏览 1 评论
575 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
430 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1032 浏览 2 评论
1621浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
284浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
294浏览 3评论
279浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
257浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-21 15:38 , Processed in 1.269309 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号