可用在中断中浮点数打印类似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;

}

相关推荐
日拱一卒——功不唐捐2 小时前
红黑树删除(C语言)
c语言·数据结构
ziguo11226 小时前
C/C++ 错误处理全解:从 errno 到 C++ 异常
linux·c语言·c++·windows·visual studio
小+不通文墨9 小时前
--no-multibyte-chars 解决OLED_data.c移植后中文乱码问题
c语言·经验分享·笔记·学习
dtq04249 小时前
C语言-文件操作1
c语言·开发语言·学习
Suxing910 小时前
C语言基础分享:“群租房”和“点名册”——联合体与枚举
c语言·算法·c#
q275513004210 小时前
AS717 Type-C转DP 8K方案外维少 AS717电路图
c语言·开发语言
自然常数e11 小时前
顺序表专题
c语言·数据结构·visual studio
j7~12 小时前
【数据结构初阶】队列的实现(链式队列 + 循环队列)--详解
c语言·开发语言·数据结构·学习·队列·queue·c\c++
草莓熊Lotso12 小时前
【Linux网络】深入理解Linux IO多路复用:select服务器完善、内核原理与poll实战
linux·运维·服务器·c语言·网络·c++
king_linlin12 小时前
算法基础——算法复杂度
c语言·开发语言·数据结构·算法