打印
[C语言]

串口控制台----16进制转ASCII码

[复制链接]
1595|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2014-10-10 08:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
arefeng| | 2014-10-10 16:07 | 只看该作者
是单片机的还是PC的?是串口上的内存还是其它区域的内存?

使用特权

评论回复
板凳
xlsbz|  楼主 | 2014-10-10 20:47 | 只看该作者
单片机啊

使用特权

评论回复
地板
ningling_21| | 2014-10-10 23:39 | 只看该作者
定义一个字符数组
uchar ascii[]={"0123456789ABCDEF"};

随便一个数 c=0X98;

send_char( ascii[c>>4]);//打印高4位
send_char( ascii[c&0x0f]);//打印低4位

使用特权

评论回复
5
hgjinwei| | 2014-10-11 21:38 | 只看该作者
我都是这么打印内存数据的

#define tst_select(f,v1,v2)     ((f) ? (v1) : (v2))
#define hex2ascii(val)          tst_select((val) < 10, (val) + '0',(val) + ('A' - 10))

/* 调试内存数据打印 */
int __ddump(const char *fix,int len,i_void *pdat)
{
    int         i;
    int         ch;
    int         dump_len;
    uint8      *sp;
   
    extern int lpc22xx_uart_putchar(lpc24xx_uart_t *port,int ch,int timo);
#   define dump_putchar(ch)     lpc22xx_uart_putchar(LPC22XX_UART0,ch,0)
   
   
    os_enter_critical();
    if(NULL != fix){
        printf("%s[%u]:\r\n", fix,len);
    }
   
    for(sp = (uint8*)pdat; len > 0; len -= dump_len,sp += dump_len){
        dump_len = (len >= 16) ? 16: len;
        ch = sp - (uint8*)pdat;
        dump_putchar(hex2ascii(((uint32)ch >>12) & 0xF));
        dump_putchar(hex2ascii(((uint32)ch >> 8) & 0xF));
        dump_putchar(hex2ascii(((uint32)ch >> 4) & 0xF));
        dump_putchar(hex2ascii(((uint32)ch >> 0) & 0xF));
        dump_putchar(':');
        dump_putchar(' ');
        for(i = 0; i < dump_len; i++){
            ch = sp[i];
            dump_putchar(hex2ascii(((uint32)ch >> 4) & 0xF));
            dump_putchar(hex2ascii(((uint32)ch >> 0) & 0xF));
            dump_putchar(' ');
        }
        
        for(; i < 16; i++){
            dump_putchar(' ');
            dump_putchar(' ');
            dump_putchar(' ');
        }
        
        dump_putchar('|');
        dump_putchar(' ');
        for(i = 0; i < dump_len; i++){
            ch = sp[i];
            dump_putchar((ch >= 0x20) ? ch : '.');
        }
        
        dump_putchar('\r');
        dump_putchar('\n');
    }
   
    os_exit_critical();
    return(0);
}

使用特权

评论回复
6
hgjinwei| | 2014-10-11 21:51 | 只看该作者
运行效果:
__ddump("commom buff",ISS_COMMOM_BUFFER_SIZE,g_iss_commom_buff);

QQ图片20141011215047.jpg (190.54 KB )

QQ图片20141011215047.jpg

使用特权

评论回复
7
xlsbz|  楼主 | 2014-10-11 22:18 | 只看该作者
恩。手机怎么看不了。应该值得参考

使用特权

评论回复
8
xlsbz|  楼主 | 2014-10-11 22:20 | 只看该作者
hgjinwei 发表于 2014-10-11 21:51
运行效果:
__ddump("commom buff",ISS_COMMOM_BUFFER_SIZE,g_iss_commom_buff);

搞成字符串就能高大上。这很重要。

使用特权

评论回复
9
渤海三叠浪| | 2014-10-12 07:20 | 只看该作者

void AsciiToHex(const char * ascii, int length, char * hex)
{
        static const char plate[] = "0123456789abcdef";

        for (int i = 0; i < length; i++)
        {
                hex[i * 2 + 1] = plate[ascii[i] & 0x0F];
                hex[i * 2] = plate[(ascii[i] >> 4) & 0x0F];
        }
}

void HexToAscii(const char * hex, int length, char * ascii)
{
        for (int i = 0; i < length; i += 2)
        {
                if (hex[i] >= '0' && hex[i] <= '9')
                        ascii[i / 2] = (hex[i] - '0') << 4;
                else if (hex[i] >= 'a' && hex[i] <= 'z')
                        ascii[i / 2] = (hex[i] - 'a' + 10) << 4;
                else if (hex[i] >= 'A' && hex[i] <= 'Z')
                        ascii[i / 2] = (hex[i] - 'A' + 10) << 4;

                if (hex[i + 1] >= '0' && hex[i + 1] <= '9')
                        ascii[i / 2] += hex[i + 1] - '0';
                else if (hex[i + 1] >= 'a' && hex[i + 1] <= 'z')
                        ascii[i / 2] += hex[i + 1] - 'a' + 10;
                else if (hex[i + 1] >= 'A' && hex[i + 1] <= 'Z')
                        ascii[i / 2] += hex[i + 1] - 'A' + 10;
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝