|
大家在调试时一般用了不少printf函数吧,在keil里怎么用printf,以及怎么重定向输出到串口上大家应该都比较熟悉了。- W% l) N4 r# i+ m 但在使用printf函数时大家还是小心一些,前几天在调试程序时碰到了在循环里使用printf函数调试导致程序堵死,折腾了好几天,后来问黑金的版主才知道问题出在printf函数上,注释掉就可以了。6 l/ o) s" b2 X3 {+ \7 q 这里我贴上一些代码,用自定义的函数替代printf,希望对大家有些帮助。1 I( |9 D# W. k$ @ |3 q# [, p' b/ a void cli_puts(char* sz): f! H. @& U% |9 c2 J4 t. H1 M {3 \# z, F2 U* N8 y. \ /* 这里添加在某串口输出字符串的代码 */ char c;- |' u' O* H5 v X while ((c = *sz++) != 0) { while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET); USART_SendData(UART5, (uint16_t)c);5 M' ~) Z- F$ C5 {% K }" F! @6 R$ t: K+ [, f } 9 k3 m: s- R' o5 j% Y! O8 A3 {1 E void cli_echo(const char* fmt, ...)* `- ^2 }& O) H$ S0 u& [# y3 }9 a; y; u { static char sz[1024] = { 0, }; /* 组合使用可变参数以及vsprintf,实现printf */5 z7 `7 k# ~, m! F va_list ap;- ]# q0 K; D$ F# x0 K* t/ U 6 c6 q+ L* }4 A! [2 G va_start(ap, fmt); vsprintf(sz, fmt, ap); cli_puts(sz); va_end(ap); }( R- v% H% p9 V% y 3 g9 @3 {$ Y, U: I+ j. _ 上述cli_echo函数即可以替代printf函数的功能。 & [5 n( U7 n- q" G/ H% N |
微信公众号
手机版
前提:STDIO.H,自建的发送字符串函数;/ R B- l+ T& Z' L% o4 k: j
使用方式:
步骤:1.调用sprintf()函数,此函数用法与printf()基本一致,两者输出不同,Printf()函数直接硬件输出,sprintf()输出到其形参字符串中;
2.输出sprintf()中的形参字符串;
附STDIO.H中printf(),sprint()的定义,区别之处以加粗倾倒发红
{
static char sz[1024] = { 0, };+ ~# g& |1 j6 s- L8 }4 B O* W: T, T
/* 组合使用可变参数以及vsprintf,实现printf */
va_list ap;2 e/ H+ Q) O; ~( b
va_start(ap, fmt);! l7 y; Y+ Z9 [/ j
vsprintf(sz, fmt, ap);
cli_puts(sz);
va_end(ap);% G! R( `' E5 s5 ~
}/ h! l$ X; R# t: ]
这个没看明白。知道是格式组合,但具体 每一个函数怎么实现的?