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

}

相关推荐
JasmineX-12 小时前
数据结构(笔记)——顺序栈
c语言·数据结构·笔记
2401_862880822 小时前
嵌入式Linux系统移植与驱动开发完整指南
linux·c语言·驱动开发
我叫洋洋4 小时前
Cadence 16.6 从 OrCAD Capture 原理图到 Allegro PCB 全流程(含 5 个常见坑)
c语言·eda·嘉立创
水饺编程4 小时前
第2章:Linux 基础,关机命令
linux·c语言·汇编
Brilliantwxx5 小时前
【Linux】IO(上)全篇:文件本质、C 接口、系统调用与文件描述符
linux·运维·服务器·c语言
坐看风云变幻6 小时前
《嵌入式工程师的软硬件修仙之路》第 2 期|C 语言筑基:指针与内存模型
c语言·开发语言
爱读书的小胖1 天前
Codewars:Rot13(C)解题分析
c语言·开发语言
Code_Solitude1 天前
c语言:关于qsoet函数知识点
c语言·数据结构·算法
鸽鸽程序猿1 天前
【项目】【在线判题系统】c端:竞赛报名
c语言·开发语言
H.莓飛1 天前
【Linux】自主 Shell
linux·运维·服务器·c语言·开发语言·visual studio