|
大家在调试时一般用了不少printf函数吧,在keil里怎么用printf,以及怎么重定向输出到串口上大家应该都比较熟悉了。* x2 R. b4 \% Q 但在使用printf函数时大家还是小心一些,前几天在调试程序时碰到了在循环里使用printf函数调试导致程序堵死,折腾了好几天,后来问黑金的版主才知道问题出在printf函数上,注释掉就可以了。 这里我贴上一些代码,用自定义的函数替代printf,希望对大家有些帮助。 void cli_puts(char* sz) {, d' N/ O9 X6 j1 b /* 这里添加在某串口输出字符串的代码 */ char c; while ((c = *sz++) != 0) {4 {. B& s0 @/ g+ y% e- @5 | while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET);9 Q' T0 v% E% W* c USART_SendData(UART5, (uint16_t)c);9 G \3 t5 h- X9 G }, l9 r# e# @- U i! Z, u5 j } void cli_echo(const char* fmt, ...) { static char sz[1024] = { 0, };" A8 ^3 e$ i/ m, P; S /* 组合使用可变参数以及vsprintf,实现printf */ va_list ap;3 h4 j& u) ]0 C, V d va_start(ap, fmt);5 ~1 d3 f0 W: L4 v vsprintf(sz, fmt, ap); z0 C6 X& _6 b) Z) c- o4 p3 Z cli_puts(sz);) |* ]- y# o. F x, W va_end(ap); c: X$ Q: r ~5 j }: z4 n( M- v) c! D1 q D3 d% f 上述cli_echo函数即可以替代printf函数的功能。+ [1 f2 C' k3 j* G/ F ; q' p, S, y7 |+ m ! [1 Y- S# u2 Y9 f% g' I1 ~ |
微信公众号
手机版
前提:STDIO.H,自建的发送字符串函数;
使用方式:
步骤:1.调用sprintf()函数,此函数用法与printf()基本一致,两者输出不同,Printf()函数直接硬件输出,sprintf()输出到其形参字符串中;
2.输出sprintf()中的形参字符串;
附STDIO.H中printf(),sprint()的定义,区别之处以加粗倾倒发红
{. {1 J! h% E. P) M. b* r
static char sz[1024] = { 0, };
/* 组合使用可变参数以及vsprintf,实现printf */" x1 Y: T5 {+ n) T" p8 e
va_list ap;& t/ a* H# p( N0 y/ v$ ^+ u
va_start(ap, fmt);
vsprintf(sz, fmt, ap);
cli_puts(sz);
va_end(ap);
}
这个没看明白。知道是格式组合,但具体 每一个函数怎么实现的?