可用在中断中浮点数打印类似printf

// 统一字符输出入口

static void put_char(char ch)

{

#ifdef PRINT_TARGET_RTT

SEGGER_RTT_PutCharSkipNoLock(0, ch);

#endif

#ifdef PRINT_TARGET_UART

// 调用你工程的串口发送单字符函数

UART_SendData(ch);

#endif

#ifdef PRINT_TARGET_LCD

// 调用液晶屏幕字符输出函数

LCD_PutChar(ch);

#endif

}

//适合前导零补齐,或空格右对齐

void putNum(int num, int base, uint8_t charNum, uint8_t fillchar)

{

char buf12;

int i = 0;

int is_neg = 0;

if(num < 0)

{

is_neg = 1;

num = -num;

}

if(num == 0)

{

bufi++ = '0';

}

else

{

do

{

int rem = num % base;

if(rem < 10)

bufi++ = '0' + rem;

else

bufi++ = 'A' + (rem - 10);

num /= base;

} while(num > 0);

}

int pad_len = charNum - i;

if(is_neg) pad_len--;

while(pad_len > 0)

{

put_char(fillchar);

pad_len--;

}

if(is_neg)

{

put_char('-');

}

while(i > 0)

{

put_char(buf--i);

}

}

int log_print(const char * sFormat, ...)

{

int i = 0;

uint8_t format;

va_list ParamList;

va_start(ParamList, sFormat);

const char* s = sFormat;

while(*s != '\0' && i < 255)

{

if (*s == '%')

{

s++;

int wide = 0;

int widePoint = 0;

// 解析总位宽

while(*s >= '0' && *s <= '9')

{

wide = wide * 10 + (*s - '0');

s++;

}

// 解析小数位

if(*s == '.')

{

s++;

while(*s >= '0' && *s <= '9')

{

widePoint = widePoint * 10 + (*s - '0');

s++;

}

}

format = *s;

s++;

if(format >= 'a' && format <= 'z')

format -= 'a' - 'A';

if(format == 'F')

{

double f = va_arg(ParamList, double);

int is_neg = 0;

if(f < 0)

{

is_neg = 1;

f = -f;

}

int int_val = (int)f;

int int_w = wide;

if(widePoint > 0)

int_w = wide - widePoint - 1;

if(is_neg)

{

put_char('-');

int_w--;

}

putNum(int_val, 10, int_w, ' ');

if(widePoint > 0)

{

put_char('.');

unsigned int dec_val = (unsigned int)(f * pow(10, widePoint) + 0.5);

putNum(dec_val, 10, widePoint, '0');

}

}

else

{

int v = va_arg(ParamList, int);

switch(format)

{

case 'S':

put_char((char)v);

break;

case 'D':

putNum(v, 10, wide, ' ');

break;

case 'X':

case 'P':

putNum(v, 16, wide, '0');

break;

default:

break;

}

}

}

else

{

put_char(*s);

s++;

}

i++;

}

va_end(ParamList);

return 0;

}

相关推荐
动词ing1 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
动词ing3 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
caimouse3 小时前
ReactOS 窗口系统分析(7):分层窗口与绘制辅助 — layered.c + draw.c
c语言·开发语言
不灭的黄金瞳1236 小时前
预处理详解
c语言
小雪崩7 小时前
嵌入式学习 day25:哈希表及排序与查找
linux·c语言·数据结构·学习·排序算法
yiqiefeimeng7 小时前
C语言指针难倒90%人?买房比喻让你瞬间开窍
c语言·学习·编程·指针·比喻
caimouse8 小时前
ReactOS 窗口系统分析(5):可见区域与窗口 DC — vis.c + windc.c
c语言·开发语言
_Narcissus_10 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
Cerman10 小时前
QEMU启动OVMF shell超时分析
c语言·windows·经验分享
_Narcissus_12 小时前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举