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

}

相关推荐
Zwawa5 小时前
用两个按键做一个OLED菜单:先把选择和执行分开
c语言·单片机·嵌入式
心仪久了会沦陷10 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
Severus_black13 小时前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
希和202717 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
Zwawa1 天前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式
Fruiticecake1 天前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++
田甲1 天前
做一款 Type-C 母座读卡器:GL3224 双卡方案实测
c语言·开发语言
·present·2 天前
CSAPP(lecture 13_02 Linking)
c语言·c++
wuyk5552 天前
Keil工具链-第05讲-启动文件与__main到底做了什么
c语言·stm32·单片机·嵌入式硬件·物联网
Navigator_Z2 天前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode