#include "stdarg.h" |
typedef enum { |
dec = 0, //10进制 |
hex, //16进制(小写字母) |
HEX //16进制(大写字母) |
}Radix_TypeDef; |
void Uart_SendByte(u8 byte) |
{ |
//code... |
} |
void Uart_SendStr(u8* str) |
{ |
while (*str != '\0' ) |
{ |
Uart_SendByte(*str++); |
} |
} |
/** |
* @brief 整型数据转化为字符串 |
* @param buf 存放字符串的指针 |
* digit 需要转化的整型数据 |
* radix 进制 |
* dec:十进制 |
* hex:十六进制(小写字母) |
* HEX:十六进制(大写字母) |
* @retval 返回字符的字节数 |
*/ |
int itoa(u8 *buf, int digit, Radix_TypeDef radix) |
{ |
u32 i; |
u8 temp; |
u8 flag = 0; |
int retval = 0;; |
if (digit==0) |
{ |
*buf = '0' ; |
retval = 1; |
return retval; |
} |
if (digit < 0) |
{ |
*buf++ = '-' ; |
digit *= -1; |
} |
switch (radix) |
{ |
case dec: |
for (i=1000000000; i>0; i/=10) |
{ |
temp = digit/i; |
if (temp || flag) |
{ |
flag = 1; |
*buf++ = '0' + temp; |
digit -= temp * i; |
retval++; |
} |
} |
break ; |
case hex: |
case HEX: |
for (i=0x10000; i>0; i/=0x10) |
{ |
temp = digit/i; |
if (temp || flag) |
{ |
flag = 1; |
digit -= temp*i; |
if (temp < 10) |
*buf++ = '0' + temp; |
else |
{ |
if (radix == hex) |
*buf++ = 'a' + temp - 10; |
else |
*buf++ = 'A' + temp - 10; |
} |
retval++; |
} |
} |
break ; |
} |
return retval; |
} |
/** |
* @brief 使用类似printf的格式输出串口 |
* @param |
* 转义字符: \n 回车 \t 空三格 |
* %d 带符号10进制整型 %X 带符号16进制整型(大写字母) |
* %c 字符 %x 带符号16进制整型(小写字母) |
* %s 字符串 |
* 支持格式:%d、%x、%X 三种转义字符支持数据前面补0或补空格。如 %9d, %09d, %9x, %09x, %9X, %09X |
* @retval 返回打印字节数 |
*/ |
u16 My_printf( const char * format, ...) |
{ |
u8 i; |
u8 flag; |
|
u8 buf[10]; |
int digit; //数字 |
char *s; |
char c; |
u16 retval = 0; //返回值,返回打印字节数 |
u8 num; |
|
u8 num_tk_up = 0; //补缺数,(补空格或补0) |
va_list ap; |
va_start (ap,format); |
|
while (*format != '\0' ) |
{ |
switch (*format) |
{ |
case '%' : |
//空缺补0或补空格 |
if (format[1]>= '0' && format[1]<= '9' ) |
{ |
//补0 |
if (format[1] == '0' ) |
{ |
if (format[2]> '0' && format[2]<= '9' ) |
{ |
flag = 1; |
format += 3; |
} |
} |
//补空格 |
else |
{ |
flag = 0; |
format += 2; |
} |
digit = va_arg (ap, int ); |
num = 0; |
switch (*format++) |
{ |
case 'd' : |
num = itoa(buf, (u8)digit, dec); |
break ; |
case 'x' : |
num = itoa(buf, (u8)digit, hex); |
break ; |
case 'X' : |
num = itoa(buf, (u8)digit, HEX); |
break ; |
} |
*(buf+num) = '\0' ; |
num_tk_up = 0; |
if (*(format - 2) - '0' > num) |
{ |
num_tk_up = *(format - 2) - '0' - num; |
} |
for (i=0; i<num_tk_up; i++) |
{ |
if (flag) |
Uart_SendByte( '0' ); |
else |
Uart_SendByte( ' ' ); |
} |
Uart_SendStr(buf); |
retval += num_tk_up + num;; |
} |
else |
{ |
num = 0; |
switch (*++format) |
{ |
case 'd' : |
digit = va_arg (ap, int ); |
num = itoa(buf, digit, dec); |
*(buf+num) = '\0' ; |
Uart_SendStr(buf); |
break ; |
case 'x' : |
digit = va_arg (ap, int ); |
num = itoa(buf, digit, hex); |
*(buf+num) = '\0' ; |
Uart_SendStr(buf); |
break ; |
case 'X' : |
digit = va_arg (ap, int ); |
num = itoa(buf, digit, HEX); |
*(buf+num) = '\0' ; |
Uart_SendStr(buf); |
break ; |
case 'c' : |
c = va_arg (ap, char ); |
num = 1; |
Uart_SendByte(c); |
break ; |
case 's' : |
s = va_arg (ap, char *); |
for (num=0; s[num]!= '\0' ; num++); |
Uart_SendStr((u8*)s); |
break ; |
} |
format++; |
retval += num; |
} |
break ; |
case '\\' : |
case '\t' : |
case '\n' : |
case '\r' : |
default : |
Uart_SendByte(*format++); |
retval++; |
break ; |
} |
} |
va_end (ap); |
return retval; |
} |
by: 发表于:2017-08-10 09:24:45 顶(0) | 踩(0) 回复
??
回复评论