独闷闷网

标题: 如何将上位机发送的十六进制数据转换成十进制?已解答? [打印本页]

作者: xiao_yp2014    时间: 2015-7-24 22:44
标题: 如何将上位机发送的十六进制数据转换成十进制?已解答?
本帖最后由 xiao_yp2014 于 2016-1-21 14:39 编辑

如何将上位机发送的十六进制数据转换成十进制

用上位发命令来控制下位机,这个是很常用的作法了,但是就数据而言,上位机一般都是以十六进制发送,有的时候需要用的十进制,这个用法是很独特的,比如上机以十六进制发送“0X10”字节数据,下位就要转换成十进制数据“10”这个转换其实是不符合进制之间的转换的,十六进制的“0X10”转换成十进制是“16”那如何才能将十六进制数据原封不动的转换成十进制呢?
实际应用:比如通过上位机控制单片机去操作某个外设的次数,这个次数是通过上位发送给单片机(十六进制发送),单片机做次数判断用十进制要容易处理,所以要转换。

例子:比如十六进制的“0X10”,转换成十进制是“16”,这里要转换成十进制的“10”,面不是“16”

方法如下:
  1. unsigned int Hex_Conversion(unsigned char ucHexValue)
  2. {
  3.    /*
  4.      例子:比如十六进制的“0X10”,转换成十进制是“16”,这里的“16”和“0X10”中间差6,所以要减去一个“6”
  5.    */
  6.    static unsigned char ucConversionTemp = 0;
  7.    switch(ucHexValue&0xf0)         //用于判断是在那个段之间
  8.    {
  9.               case 0x00:ucConversionTemp = 0;        //不同的段减的值不同,减的值是十六进制与十进制转换差
  10.            break;                                                        //找到相应段,就跳出
  11.            case 0x10:ucConversionTemp = 6;        //不同的段减的值不同,减的值是十六进制与十进制转换差
  12.            break;                                                        //找到相应段,就跳出
  13.            case 0x20:ucConversionTemp = 12;        //不同的段减的值不同,减的值是十六进制与十进制转换差
  14.            break;                                                        //找到相应段,就跳出
  15.            case 0x30:ucConversionTemp = 18;        //不同的段减的值不同,减的值是十六进制与十进制转换差
  16.            break;                                                        //找到相应段,就跳出
  17.            case 0x40:ucConversionTemp = 24;        //不同的段减的值不同,减的值是十六进制与十进制转换差
  18.            break;                                                        //找到相应段,就跳出
  19.            case 0x50:ucConversionTemp = 30;        //不同的段减的值不同,减的值是十六进制与十进制转换差
  20.            break;                                                        //找到相应段,就跳出
  21.            case 0x60:ucConversionTemp = 36;        //不同的段减的值不同,减的值是十六进制与十进制转换差
  22.            break;                                                        //找到相应段,就跳出
  23.            case 0x70:ucConversionTemp = 42;        //不同的段减的值不同,减的值是十六进制与十进制转换差
  24.            break;                                                        //找到相应段,就跳出
  25.            case 0x80:ucConversionTemp = 48;        //不同的段减的值不同,减的值是十六进制与十进制转换差
  26.            break;                                                        //找到相应段,就跳出
  27.            case 0x90:ucConversionTemp = 54;        //不同的段减的值不同,减的值是十六进制与十进制转换差
  28.            break;                                                        //找到相应段,就跳出
  29.    }
  30.    uiConValue = ((unsigned int)(ucHexValue-ucConversionTemp));  //计算转换成十进制数据
  31.    return uiConValue;         //返回十进制数据
  32. }
复制代码










欢迎光临 独闷闷网 (http://dumenmen.com/) Powered by Discuz! X3.2