十六进制转ASCII码

记录一下自己在做项目的时候遇到的问题:
芯片传回来的数据是以十六进制表示的,但是我想要把这十六进制代表的数据通过UART发送到电脑上表示出来,所以最终要求就是将十六进制表示的数据用ASCII码表示传给电脑。
但是所用的单片机又调不出sprintf函数…
后面发现从HEX到ASCII很难直接实现,所以便想到:HEX—>BCD,BCD—>ASCII

//==========================HEX转BCD码=================================
unsigned int HEX2BCD(unsigned char hex_data)
{
    unsigned int bcd_data;
    unsigned char temp;
    temp=hex_data%100;
    bcd_data=((unsigned int)hex_data)/100<<8;
    bcd_data=bcd_data|temp/10<<4;
    bcd_data=bcd_data|temp%10;
    return bcd_data;
}
//==========================BCD转ASCII码==============================
const unsigned char bcd2ascii[10]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
void BCD2ASCII(unsigned char *BCD_data,unsigned char *ASCII_data)
{
    while(*BCD_data)
    {
        unsigned char temp=*BCD_data++;
        unsigned char c;
        c=temp>>4;//取高4位BCD码
        *ASCII_data++=bcd2ascii[c];//先赋值,指针再自增
        c=temp&0x0f;//取低4位BCD码
        *ASCII_data++=bcd2ascii[c];
        //*ASCII_data++=' ';         //每次读完发送一个,号
    }
    //*ASCII_data++='\r';
    //*ASCII_data='\n';              //发送完一次数据打入一个回车符
}

要注意的是在进行这样的类似字符串操作时:
1.指针初始化指向的是一个字符串的首地址!指针指向的变量也要有一定的范围
2.字符串与字符数组的区别在于字符串最后一位为’\0’,用指针循环while(*p)时判断标志位就为’\0’!字符串赋初值时编译器会给字符串后添加’\0’

你可能感兴趣的:(C语言)