在用单片机与别的外设做串口通信传递数据的时候,经常会遇到各种数据类型的转换,比如,设备端发送出来的当前日期信息本来对应的十进制应该是:18-3-27 9:00:00,但是实际传递过来的数据却都是十六进制,并且也正好是:0x18 0x03 0x27 0x09 0x00 0x00,如果直接将这数据转发的话,就变成了十进制:24 03 39 09 00 00,所以需要转换一下,即:将十六进制数0x18转换成十进制18、十六进制数0x03转换成十进制3……运行环境为keil 4/keil 5。
一个典型应用,比如迪文的DGUS屏,串口读取RCT命令为(十六进制):5A A5 03 81 20 07,触摸屏返回(十六进制):5A A5 0A 81 20 07 18(年) 03(月)26(日) 01(星期) 17(时) 33(分) 13(秒),如果单纯的处理收到的数据对应的十进制日期变成了:24年3月38日 23点51分13秒,而 实际上我们程序中要处理的是对应的十进制日期:18年3月26日 17点33分13秒。
那么问题来了,如何能实现快速转换等到想要的十进制数?
如果是你说的这个样子的话,写一个Hex2Dec函数吧
比如
int Hex2Dec(int Hex) { int dec=0,temp=0; temp= Hex & 0x0f; //低四位 dec = (Hex >> 4) *10 + temp;//高四位乘10加低四位 return dec; }
十六进制和ASC码之间的转换代码如下,可以参考。
//将一个十六进制数转换成两个ASCII码 word Hex2Word(byte data) { byte btmp; //定义一个byte临时变量 word wtmp; //定义一个word临时变量 btmp=data&0xF0; //先取data的高四位 btmp=btmp>>4; //把高四位移动到低四位 if(btmp<=9){//如果是0~9 btmp+=0x30; }else //如果是a~f { btmp+=0x37; } wtmp=btmp; wtmp=wtmp<<8; btmp=data&0x0F; if(btmp<=9){//如果是0~9 btmp+=0x30; }else //如果是a~f { btmp+=0x37; } wtmp+=btmp; return wtmp; } byte Word2Hex(word data) { byte btmp,ret; btmp=data>>8; if((btmp>=0x30)&&(btmp<=0x39)) { ret=btmp-0x30; }else if((btmp>=0x41)&&(btmp<=0x46)) { ret=btmp-0x37; }else if((btmp>=0x61)&&(btmp<=0x66)) { ret=btmp-0x57; } ret=ret<<4; btmp=data&0x00FF; if((btmp>=0x30)&&(btmp<=0x39)) { btmp=btmp-0x30; }else if((btmp>=0x41)&&(btmp<=0x46)) { btmp=btmp-0x37; }else if((btmp>=0x61)&&(btmp<=0x66)) { btmp=btmp-0x57; } ret+=btmp; return ret; }
比如 你的数字是0x18,你 a=0x18;
b=a>>4;
b*=6;
结果=a-b;
如果0xXXX三位数字,取最高位,就除以 (16*16)
除以16取余数做最低位例子:0x20/16 = 2, 将2存在变量a;
0x20%16 = 0,将0存在变量b;
然后转换一下a 和 b的ASSC码,或者 直接 a*10 + b 当十进制用,就是你的事了
查0x,把0x删了就是了。一般都是会给ASCII格式的,没遇到你说的这种情况
while(num>0) { yushu=num%16; a[i]=yushu; num=num/16; i++; }
下面的代码仅仅对16bit数据有效,超过的无效。in=0x18; out= (in>>4)*10+(in&0x0f);