硬汉嵌入式论坛

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

[SEGGER RTT] RTT原生似乎没有16进制显示的功能?

[复制链接]

22

主题

183

回帖

249

积分

高级会员

积分
249
QQ
发表于 2024-6-11 17:15:18 | 显示全部楼层 |阅读模式
最近琢磨把RTT整进工程里,移植非常方便。


但是RTT好像没有16进制字节打印的功能,那作用就很有限了,是否一定要自己包装一下RTT_printf函数?
因为我们都是不用print函数的,都是走私有协议做调试,计划未来把RTT也走到私有协议里
回复

使用道具 举报

48

主题

374

回帖

518

积分

金牌会员

积分
518
发表于 2024-6-11 19:02:02 | 显示全部楼层
我的工程里做了一个Member buffer打印函数,可以借鉴一下




void trace_buffer(const uint8_t* buf, int len)
{
    int i, c;

    while ((int)len > 0)
    {
        SEGGER_RTT_printf(0, "%08X: ", buf);

        for (i = 0; i < 16; i++)
        {
            if (i < (int)len)
            {
                SEGGER_RTT_printf(0, "%02X ", buf & 0xFF);
            }
            else
            {
                SEGGER_RTT_printf(0, "   ");
            }

            if (i == 7)
            {
                SEGGER_RTT_printf(0, " ");
            }
        }

        SEGGER_RTT_printf(0, " |");

        for (i = 0; i < 16; i++)
        {
            if (i < (int)len)
            {
                c = buf & 0xFF;

                if ((c < 0x20) || (c >= 0x7F))
                {
                    c = '.';
                }
            }
            else
            {
                c = ' ';
            }

            SEGGER_RTT_printf(0, "%c", c);
        }

        SEGGER_RTT_printf(0, "|\n");
        len -= 16;
        buf += 16;
    }
}



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-6-11 17:18:17 | 显示全部楼层
sprintf转换,转换生成的字符即可
回复

使用道具 举报

3

主题

33

回帖

42

积分

新手上路

积分
42
发表于 2024-6-11 17:25:54 | 显示全部楼层
eric2013 发表于 2024-6-11 17:18
sprintf转换,转换生成的字符即可

浮点数也可以这么玩吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-6-11 17:31:30 | 显示全部楼层
panyi1013 发表于 2024-6-11 17:25
浮点数也可以这么玩吗?

对。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-6-11 19:04:46 | 显示全部楼层
wanglehui_12 发表于 2024-6-11 19:02
我的工程里做了一个Member buffer打印函数,可以借鉴一下

浮点的处理比较麻烦。
回复

使用道具 举报

85

主题

781

回帖

1036

积分

至尊会员

积分
1036
发表于 2024-6-11 22:47:18 | 显示全部楼层
eric2013 发表于 2024-6-11 19:04
浮点的处理比较麻烦。

其实浮点数如果不需要实时显示,我感觉j-scope来简介打印是个不错的方式
回复

使用道具 举报

22

主题

183

回帖

249

积分

高级会员

积分
249
QQ
 楼主| 发表于 2024-6-12 08:51:57 | 显示全部楼层
本帖最后由 yono 于 2024-6-12 09:06 编辑
wanglehui_12 发表于 2024-6-11 19:02
我的工程里做了一个Member buffer打印函数,可以借鉴一下

高手啊!这个好用!效果如下
RTT_Trace.png

不过在两个 buf & 0xFF 的地方是不是写错了,应该是 buf[ & 0xFF 才对
回复

使用道具 举报

7

主题

33

回帖

54

积分

初级会员

积分
54
发表于 2024-6-12 10:11:46 | 显示全部楼层
yono 发表于 2024-6-12 08:51
高手啊!这个好用!效果如下

这个界面是怎么搞的,感觉怎么这么好看
回复

使用道具 举报

4

主题

178

回帖

190

积分

初级会员

积分
190
发表于 2024-6-12 10:26:21 | 显示全部楼层
yono 发表于 2024-6-12 08:51
高手啊!这个好用!效果如下

你这个是用什么终端工具打印的,不是RTT view吧,看起来不错
回复

使用道具 举报

22

主题

183

回帖

249

积分

高级会员

积分
249
QQ
 楼主| 发表于 2024-6-12 11:09:40 | 显示全部楼层
Yhlr 发表于 2024-6-12 10:11
这个界面是怎么搞的,感觉怎么这么好看

只是普通的vscode终端控制台而已,好看的主题很多,可以参考这个帖子

分享一个 VS Code 的单片机开发工具 --- EIDE - 开发环境 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)

EIDE切AC6或者gcc编译链也很方便,RTT终端也可以用EIDE自动启用
vscode终端.png

回复

使用道具 举报

1

主题

27

回帖

30

积分

新手上路

积分
30
发表于 2024-6-12 21:01:55 | 显示全部楼层
分享一下我的
[C] 纯文本查看 复制代码
PrintArray((uint8_t *)(0x68000000), 32, 1000);


屏幕截图 2024-06-12 210020.png

[C] 纯文本查看 复制代码
/**
 * @brief 打印数组成表格,每隔16行打印一次元素序号
 * @param array 要打印的数组
 * @param num_per_row 每行打印元素个数
 * @param size 要打印的元素个数
 */
void PrintArray(uint8_t *array, uint8_t num_per_row, uint16_t size)
{
    printf("\n----------print [0x%p]----------\n", array);
    uint16_t i = 0, j = 0;  /* 循环变量 */
    uint16_t row_count = 0; /* 行计数器,用于跟踪已打印的行数,从0开始 */

    for (i = 0; i < size; i++)
    {
        /* 每打印 num_per_row 个元素后 */
        if (i % num_per_row == 0)
        {
            /* 如果是每16行的开始,打印元素序号 */
            if ((row_count % 16) == 0)
            {
                printf("\n    |");
                for (j = 0; j < num_per_row; j++)
                {
                    printf("%02X ", j);
                }
                printf("\n");
            }
            /* 打印当前行的行号 */
            printf("%04X|", row_count);
            row_count++; /* 行数增加 */
        }

        /* 打印数组元素 */
        printf("%02X ", array[i]);

        /* 检查是否是当前行或数组的最后一个元素 */
        if ((i + 1) % num_per_row == 0 || i == size - 1)
        {
            /* 在每行末尾或数据结束时添加竖线 */
            printf("|");

            /* 如果不是数组的最后元素,则打印换行符 */
            if (i != size - 1)
            {
                printf("\n");
            }
        }
    }
    /* 打印结束 */
    // printf("\n----------print complete----------\n\n");
}

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-28 20:11 , Processed in 0.703470 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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