硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6844|回复: 18
收起左侧

ChaN老师写的简易printf实现--xprintf,适合容量较小的芯片使用

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118340
QQ
发表于 2020-3-23 12:53:58 | 显示全部楼层 |阅读模式
xprintf.zip (4.19 KB, 下载次数: 163)
stm32.rar (558.91 KB, 下载次数: 282)

http://elm-chan.org/fsw/strf/xprintf.html

  1. Examples:
  2.     xprintf("%d", 1234);            "1234"
  3.     xprintf("%6d,%3d%%", -200, 5);  "  -200,  5%"
  4.     xprintf("%-6u", 100);           "100   "
  5.     xprintf("%ld", 12345678L);      "12345678"
  6.     xprintf("%llu", 0x100000000);   "4294967296"   <_USE_LONGLONG>
  7.     xprintf("%04x", 0xA3);          "00a3"
  8.     xprintf("%08lX", 0x123ABC);     "00123ABC"
  9.     xprintf("%016b", 0x550F);       "0101010100001111"
  10.     xprintf("%*d", 6, 100);         "   100"
  11.     xprintf("%s", "String");        "String"
  12.     xprintf("%-5s", "abc");         "abc  "
  13.     xprintf("%5s", "abc");          "  abc"
  14.     xprintf("%c", 'a');             "a"
  15.     xprintf("%f", 10.0);            <xprintf lacks floating point support. Use regular printf.>
复制代码





回复

使用道具 举报

5

主题

215

回帖

230

积分

高级会员

积分
230
发表于 2020-3-23 13:00:36 | 显示全部楼层
现在较少关注这种了。因为现在用的flash都挺大的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118340
QQ
 楼主| 发表于 2020-3-23 14:31:14 | 显示全部楼层
honami520 发表于 2020-3-23 13:00
现在较少关注这种了。因为现在用的flash都挺大的。

是的,现在主要是一些用L0,G0的用户在用。
回复

使用道具 举报

81

主题

1368

回帖

1611

积分

至尊会员

积分
1611
发表于 2020-3-23 14:48:14 | 显示全部楼层
谢谢分享~~硬汉的论坛每天都来逛逛
回复

使用道具 举报

81

主题

1368

回帖

1611

积分

至尊会员

积分
1611
发表于 2020-3-23 15:06:12 | 显示全部楼层
还想请教一下,怎么使用这个文件啊?直接调用.c.h就行?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118340
QQ
 楼主| 发表于 2020-3-23 15:07:38 | 显示全部楼层
wdliming 发表于 2020-3-23 15:06
还想请教一下,怎么使用这个文件啊?直接调用.c.h就行?

那个STM32附件是完整案例。
回复

使用道具 举报

79

主题

191

回帖

428

积分

高级会员

积分
428
发表于 2020-3-24 12:26:25 | 显示全部楼层
有点鸡肋,浮点打不了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118340
QQ
 楼主| 发表于 2020-3-24 13:52:52 | 显示全部楼层
天马行空 发表于 2020-3-24 12:26
有点鸡肋,浮点打不了

一般来说有这种需求的芯片,很少做浮点处理,性能不行,要显示浮点可以适当放计算倍数来获得数值。
回复

使用道具 举报

6

主题

68

回帖

86

积分

初级会员

积分
86
发表于 2023-3-12 10:54:00 | 显示全部楼层
试了一下,不知道怎么用?
xdev_out(UartX_Put_Char);  
回复

使用道具 举报

0

主题

35

回帖

35

积分

新手上路

积分
35
发表于 2023-3-14 11:52:25 | 显示全部楼层
学习一下,平常输出这些格式还是蛮多的
回复

使用道具 举报

0

主题

35

回帖

35

积分

新手上路

积分
35
发表于 2023-3-14 13:14:57 | 显示全部楼层
不错,想认真学习一下,不过没看出来这个stm32是哪个IDE编译的,是完整的工程吗?
回复

使用道具 举报

0

主题

53

回帖

53

积分

初级会员

积分
53
发表于 2025-5-26 21:51:37 | 显示全部楼层
天马行空 发表于 2020-3-24 12:26
有点鸡肋,浮点打不了

2021可以用浮点了
回复

使用道具 举报

0

主题

53

回帖

53

积分

初级会员

积分
53
发表于 2025-5-26 21:51:47 | 显示全部楼层
天马行空 发表于 2020-3-24 12:26
有点鸡肋,浮点打不了

2021可以用浮点了
回复

使用道具 举报

15

主题

72

回帖

117

积分

初级会员

积分
117
发表于 2025-9-16 08:50:23 来自手机 | 显示全部楼层
貌似和nanoprintf差不多大,这个不支持重入吧,nanoprintf可以
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118340
QQ
 楼主| 发表于 2025-9-16 09:00:15 | 显示全部楼层
Superusrss 发表于 2025-9-16 08:50
貌似和nanoprintf差不多大,这个不支持重入吧,nanoprintf可以

是这个不
https://github.com/charlesnicholson/nanoprintf

这个里面那个文件是他的有效C文件实现,看了下没找到。
回复

使用道具 举报

15

主题

72

回帖

117

积分

初级会员

积分
117
发表于 2025-9-16 21:23:44 | 显示全部楼层
本帖最后由 Superusrss 于 2025-9-16 21:25 编辑

是这个,没有C文件,全在头文件里头
所以我稍微封装了下CPP做串口,做LCD打印都可以,继承类就行
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118340
QQ
 楼主| 发表于 2025-9-18 11:16:51 | 显示全部楼层
Superusrss 发表于 2025-9-16 21:23
是这个,没有C文件,全在头文件里头
所以我稍微封装了下CPP做串口,做LCD打印都可以,继承类就行

谢谢,我说怎么找不到。
回复

使用道具 举报

0

主题

65

回帖

65

积分

初级会员

积分
65
发表于 2025-9-19 09:11:22 | 显示全部楼层
本帖最后由 dukelec 于 2025-9-19 09:16 编辑

flash 有限的时候,譬如 bootloader 里面,我是用自己整理的 dprintf 来打印,只支持十六进制打印解析,真正的最小占用flash
但凡支持十进制打印,占用flash小不了




dprint.h 头文件:


[C] 纯文本查看 复制代码

/*
 * Software License Agreement (MIT License)
 *
 * Copyright (c) 2017, DUKELEC, Inc.
 * All rights reserved.
 *
 * Author: Duke Fong <[email]d@d-l.io[/email]>
 */

#ifndef __DPRINTF__
#define __DPRINTF__

#include "stdio.h"
#include "string.h"
#include "stdint.h"
#include <stddef.h>
#include "stdbool.h"
#include <stdlib.h>
#include <stdarg.h>

//void dputc(char c);
void dputs(char *str);
void dputh16(uint16_t val);
void dputh32(uint32_t val);

void _dprintf(char *fmt, ...);

#define printf _dprintf

#endif


dprintf.c 文件:

[C] 纯文本查看 复制代码

/*
 * Software License Agreement (MIT License)
 *
 * Copyright (c) 2017, DUKELEC, Inc.
 * All rights reserved.
 *
 * Author: Duke Fong <[email]d@d-l.io[/email]>
 */

#include "main.h"
#include "dprintf.h"


void dputs(char *str)
{
    while (*str != '\0')
        dputc(*str++);
}

void dputh16(uint16_t val)
{
    const char tlb[] = "0123456789abcdef";
    int i;
    for (i = 0; i < 4; i++) {
        dputc(tlb[val >> 12]);
        val <<= 4;
    }
}

void dputh32(uint32_t val)
{
    dputh16(val >> 16);
    dputh16(val & 0xffff);
}

void _dprintf(char *fmt, ...)
{
    va_list va;
    char ch;

    va_start(va,fmt);

    while ((ch = *(fmt++))) {
        if (ch != '%') {
            dputc(ch);
            continue;
        }

        ch = *(fmt++);
        switch (ch) {
        case 'x':
            dputh16(va_arg(va, uint32_t));
            break;
        case 'X':
            dputh32(va_arg(va, uint32_t));
            break;
#if 0
        case 's' :
            dputs(va_arg(va, char *));
            break;
        case '%' :
            dputc('%');
        default:
            break;
#endif
        }
    }
    va_end(va);
}



#if 0 打开可以额外支持 %s 字符串解析和打印 % 符号本身


回复

使用道具 举报

15

主题

72

回帖

117

积分

初级会员

积分
117
发表于 5 天前 | 显示全部楼层
dukelec 发表于 2025-9-19 09:11
flash 有限的时候,譬如 bootloader 里面,我是用自己整理的 dprintf 来打印,只支持十六进制打印解析,真 ...

很好,我K了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-27 09:25 , Processed in 0.056103 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表