EasyLogger icon indicating copy to clipboard operation
EasyLogger copied to clipboard

关于打印数据的调试问题

Open guoweilkd opened this issue 7 years ago • 9 comments

在调试过程中,很多时候会遇到打印一个数组的每个元素。比如串口调试时,可能会打印接收或者发送数组中的每个数据。 我现在的做法是: ` for(uint16_t i = 0; i < len; i++){

 elog_raw("%02X ",pbuff[i]);

}

elog_raw("\r\n"); 但这样会造成打印繁琐问题,而且在关闭打印之后,for循环会空跑一圈,造成时间浪费。 我现在的想法是: void elog_buff(char *type,char *pbuff,uint8_t len) {

    //在这儿添加相关屏蔽操作
for(uint16_t i = 0; i < len; i++){

	elog_raw(type,pbuff[i]);

}
elog_raw("\r\n");

} ` 不知道大伙感觉这个方法怎么样?

guoweilkd avatar Oct 26 '18 07:10 guoweilkd

不会添加代码,好尴尬啊

guoweilkd avatar Oct 26 '18 07:10 guoweilkd

image

你需要的应该是上面的那种 hex_dump 功能吧?

armink avatar Oct 26 '18 08:10 armink

嗯嗯 是这个功能 easylogger 里没找到这个函数啊

guoweilkd avatar Oct 26 '18 08:10 guoweilkd

EasyLogger 还不支持这个功能。我把 ulog 的这个功能贴出来,你方便改造一下,好用以后,提个 pr 吗 :)

/**
 * dump the hex format data to log
 *
 * @param name name for hex object, it will show on log header
 * @param width hex number for every line, such as: 16, 32
 * @param buf hex buffer
 * @param size buffer size
 */
void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t size)
{
#define __is_print(ch)       ((unsigned int)((ch) - ' ') < 127u - ' ')

    rt_size_t i, j;
    rt_size_t log_len = 0;
    char *log_buf = NULL, dump_string[8];
    int fmt_result;

    RT_ASSERT(ulog.init_ok);

    /* get log buffer */
    log_buf = get_log_buf();

    /* lock output */
    output_lock();

    for (i = 0, log_len = 0; i < size; i += width)
    {
        /* package header */
        fmt_result = rt_snprintf(log_buf, ULOG_LINE_BUF_SIZE, "D/HEX %s: %04X-%04X: ", name, i, i + width);
        /* calculate log length */
        if ((fmt_result > -1) && (fmt_result <= ULOG_LINE_BUF_SIZE))
        {
            log_len = fmt_result;
        }
        else
        {
            log_len = ULOG_LINE_BUF_SIZE;
        }
        /* dump hex */
        for (j = 0; j < width; j++)
        {
            if (i + j < size)
            {
                rt_snprintf(dump_string, sizeof(dump_string), "%02X ", buf[i + j]);
            }
            else
            {
                rt_strncpy(dump_string, "   ", sizeof(dump_string));
            }
            log_len += ulog_strcpy(log_len, log_buf + log_len, dump_string);
            if ((j + 1) % 8 == 0)
            {
                log_len += ulog_strcpy(log_len, log_buf + log_len, " ");
            }
        }
        log_len += ulog_strcpy(log_len, log_buf + log_len, "  ");
        /* dump char for hex */
        for (j = 0; j < width; j++)
        {
            if (i + j < size)
            {
                rt_snprintf(dump_string, sizeof(dump_string), "%c", __is_print(buf[i + j]) ? buf[i + j] : '.');
                log_len += ulog_strcpy(log_len, log_buf + log_len, dump_string);
            }
        }
        /* overflow check and reserve some space for newline sign */
        if (log_len + rt_strlen(ULOG_NEWLINE_SIGN) > ULOG_LINE_BUF_SIZE)
        {
            log_len = ULOG_LINE_BUF_SIZE - rt_strlen(ULOG_NEWLINE_SIGN);
        }
        /* package newline sign */
        log_len += ulog_strcpy(log_len, log_buf + log_len, ULOG_NEWLINE_SIGN);
        /* do log output */
        do_output(LOG_LVL_DBG, NULL, RT_TRUE, log_buf, log_len);
    }
    /* unlock output */
    output_unlock();
}

armink avatar Oct 26 '18 09:10 armink

可以的

guoweilkd avatar Oct 26 '18 09:10 guoweilkd

ulog 哪个的 开源吗? 看类型定义应给是rtthread的? 我怎么没找到

guoweilkd avatar Oct 26 '18 09:10 guoweilkd

很快会开源出来,可以关注下 RT-Thread 公众号

armink avatar Oct 26 '18 09:10 armink

ok

guoweilkd avatar Oct 27 '18 07:10 guoweilkd

ulog 已经开源出来了,你可以对比看下哈

armink avatar Nov 01 '18 00:11 armink