
大家在调试时一般用了不少printf函数吧,在keil里怎么用printf,以及怎么重定向输出到串口上大家应该都比较熟悉了。 但在使用printf函数时大家还是小心一些,前几天在调试程序时碰到了在循环里使用printf函数调试导致程序堵死,折腾了好几天,后来问黑金的版主才知道问题出在printf函数上,注释掉就可以了。 这里我贴上一些代码,用自定义的函数替代printf,希望对大家有些帮助。 , n( K3 `7 @$ _( P; J; F5 a- i1 M void cli_puts(char* sz) {# p( n8 s% i, g: ^3 |" m' B /* 这里添加在某串口输出字符串的代码 */ char c;% o, k8 C2 t/ h3 c2 _5 D# c while ((c = *sz++) != 0) {5 r6 A& H! C7 P while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET); USART_SendData(UART5, (uint16_t)c);, d6 [( q7 Z# @' U" P2 q) E9 P }! o! M* m+ v! D } $ N5 J) X5 D: C void cli_echo(const char* fmt, ...) { static char sz[1024] = { 0, }; /* 组合使用可变参数以及vsprintf,实现printf */: a. l2 F& F% X& P va_list ap;, I# K3 `5 A* a. J2 C: J / Q: R: [5 f6 v$ O1 J4 I- g+ B Y va_start(ap, fmt); vsprintf(sz, fmt, ap); cli_puts(sz); va_end(ap);2 a3 e7 N/ X& I& d" T" p }; r! R4 W# w" H% N2 Z6 L# C1 L 上述cli_echo函数即可以替代printf函数的功能。1 C; O. a3 E. F3 |/ N$ w- F* B; L 3 f4 q: b" r+ \ 7 ?5 ^9 z! a+ k; K E1 E* T$ N 0 ^$ C7 {$ P- Q* N! D m% B1 V |
前提:STDIO.H,自建的发送字符串函数;% T6 K. K8 {4 t1 I
使用方式:
步骤:1.调用sprintf()函数,此函数用法与printf()基本一致,两者输出不同,Printf()函数直接硬件输出,sprintf()输出到其形参字符串中;
2.输出sprintf()中的形参字符串;# h2 x: L+ `) ]! D9 ^0 \+ @
附STDIO.H中printf(),sprint()的定义,区别之处以加粗倾倒发红
{
static char sz[1024] = { 0, };9 [) C/ D; }' B. I& G
/* 组合使用可变参数以及vsprintf,实现printf */+ k6 C- V7 a( A
va_list ap; R, t# b4 a- r& r2 b2 r' Z+ `
, A) h c# [/ Z( U! A
va_start(ap, fmt);, }# K& C% M2 A# ]
vsprintf(sz, fmt, ap); ) a) {" I( Z8 D6 o( ]3 d
cli_puts(sz);" B0 {; i& D: Q
va_end(ap);
}% S$ o$ i, z i- M; Y3 A( F
/ ^0 e$ v3 n; g- T% G
这个没看明白。知道是格式组合,但具体 每一个函数怎么实现的?