完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在嵌入式系统中,通过串口打印log是非常重要的调试手段,但是直接调用底层驱动打印信息非常不方便,在c语言中一般使用printf打印基本的显示信息,而默认printf的结果不会通过串口发送,所以需要对printf的输出进行重定向。
有时候需要同时从多个串口输出信息,如果仍然想通过printf函数输出信息,就需要自己写printf的实现。 一. 初始化端口和配置 对串口用到的GPIO进行配置,并对串口的参数进行初始化。 二. 宏定义并实现具体的发送函数 代码在编译时首先判断__GNUC__有无定义,之后将PUTCHAR_PROTOTYPE替换成具体的定义。在keil5中,使用fputc函数,所以其实最后是重写了fputc的实现,在该函数中,调用串口的发送函数,每次发送一个字符。 三. 在使用标准库的时候,需要修改设置使用MicroLib,或者还是使用标准库并添加一部分代码,具体如图所示。 四. 最后,在需要用到printf函数的文件中要#include 五. 嵌入式系统中,有时候可能会用到多个串口,如果都想使用形如printf的函数来打印信息,就需要另一个printf函数,此时可以使用以下方法自己调用更底层的函数来实现。 1、申明头文件#include 2、buffer的大小根据需要调整,相应的循环条件也要改,此处可以定义成宏,方便调节buffer大小。 3、定义va_list变量,该变量是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。 4、va_start让arg_ptr指向printf函数可变参数里边的第一个参数; 5、vsnprintf()将按照fmt的格式将arg_ptr里的值依次转换成字符保存到buffer中,该函数有最大字符数限制,超过后会被截断,且该函数会自动在字符串末尾加‘ ’。 6、最后必须调用va_end(),由此确保堆栈的正确恢复。 这样就可以调用printf2向串口打印log了。 六. 注意:
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1800 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1096 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
735 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1684 浏览 2 评论
1943浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
744浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
578浏览 3评论
601浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
563浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 23:42 , Processed in 0.623632 second(s), Total 45, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号