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

}

相关推荐
C语言小火车3 小时前
C++ 快速排序(Quick Sort)深度精讲:分治思想、Lomuto 分区法及三数取中优化,面试手撕必会
c语言·开发语言·c++·面试·排序算法·快速排序
aaaameliaaa5 小时前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法
灯厂码农5 小时前
C语言内存管理——内存对齐与共用体union
linux·服务器·c语言
伏 念7 小时前
AI Coding 零基础实战教程
c语言·进程·预处理
你家人养牛7 小时前
OOC Relation Plugin:C 语言面向对象 开发的高效辅助工具
c语言·vscode
想你依然心痛8 小时前
嵌入式C代码规范:MISRA-C 2012核心规则解读——类型安全与未定义行为深度剖析
c语言·安全·代码规范
未来之窗软件服务9 小时前
计算机考试-C语言 应用题—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟·计算机考试
luj_17689 小时前
草酸与烟酸对消化及糖代谢的影响解析
服务器·c语言·开发语言·经验分享·算法
fei_sun9 小时前
【SystemVerilog】SystemVerilog与C语言的接口
c语言·开发语言