
大家在调试时一般用了不少printf函数吧,在keil里怎么用printf,以及怎么重定向输出到串口上大家应该都比较熟悉了。 但在使用printf函数时大家还是小心一些,前几天在调试程序时碰到了在循环里使用printf函数调试导致程序堵死,折腾了好几天,后来问黑金的版主才知道问题出在printf函数上,注释掉就可以了。$ F9 { y4 i+ I' O4 ~% D- M / m- `5 B% A, y1 O" P 这里我贴上一些代码,用自定义的函数替代printf,希望对大家有些帮助。 void cli_puts(char* sz)0 `1 F) A9 I) ` ?/ i% `! I! g {& q. z4 [. z/ _9 m5 T /* 这里添加在某串口输出字符串的代码 */( s: [& h( [& b. ^ char c;4 n. K' R$ w; t4 \ while ((c = *sz++) != 0) { while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET);1 {; l, A' P1 R5 [# h- J- K USART_SendData(UART5, (uint16_t)c);# x' i4 l1 e2 i b5 P } } void cli_echo(const char* fmt, ...)' a, H$ P" m# X* T$ C { D) p) W; l. l static char sz[1024] = { 0, }; /* 组合使用可变参数以及vsprintf,实现printf */ va_list ap; . t! @! I, I- ]6 k$ X. o va_start(ap, fmt);4 [1 V: r3 e7 P2 D" E vsprintf(sz, fmt, ap); / Z7 Z: o6 i' S3 ~3 ]1 L cli_puts(sz); va_end(ap); }! m2 N0 ^; m0 `, {- d6 F 5 ?2 N! f: p& }- T/ m: o6 N 上述cli_echo函数即可以替代printf函数的功能。 : b) Q- E4 ]$ i9 R$ e; J+ e' d |
前提:STDIO.H,自建的发送字符串函数;
使用方式:2 I$ Q7 m7 n0 M. ?+ Z7 {2 T
步骤:1.调用sprintf()函数,此函数用法与printf()基本一致,两者输出不同,Printf()函数直接硬件输出,sprintf()输出到其形参字符串中;
2.输出sprintf()中的形参字符串;0 m8 ? s G0 E7 l: D
附STDIO.H中printf(),sprint()的定义,区别之处以加粗倾倒发红
{
static char sz[1024] = { 0, };3 ?+ I; ^3 [4 _
/* 组合使用可变参数以及vsprintf,实现printf */
va_list ap;+ N9 r, { s# D5 o1 a0 T
va_start(ap, fmt);
vsprintf(sz, fmt, ap);
cli_puts(sz);' \8 r' F5 `5 c1 N$ P
va_end(ap);
}9 m3 K' R K/ l5 G' V& j: s
" R# c9 @1 [3 \9 V6 ]/ }4 P
这个没看明白。知道是格式组合,但具体 每一个函数怎么实现的?