本帖最后由 xiao_yp2014 于 2016-1-21 14:16 编辑
大家好!我叫肖亚平,从小热爱上了电子技术,读书时阴差阳错的选择了电子这方面的专业,学习电子技术。对于我的理解来说,学校里面学到的技术不是全部实用,但是必须有用,所以一直奋斗在前线。我对学习总结出一句话“压力不是有人努力,而是比你牛X N倍的人依然在努力
如何将上位机发送的十六进制数据转换成十进制
用上位发命令来控制下位机,这个是很常用的作法了,但是就数据而言,上位机一般都是以十六进制发送,有的时候需要用的十进制,这个用法是很独特的,比如上机以十六进制发送“0X10”字节数据,下位就要转换成十进制数据“10”这个转换其实是不符合进制之间的转换的,十六进制的“0X10”转换成十进制是“16”那如何才能将十六进制数据原封不动的转换成十进制呢? 实际应用:比如通过上位机控制单片机去操作某个外设的次数,这个次数是通过上位发送给单片机(十六进制发送),单片机做次数判断用十进制要容易处理,所以要转换。
例子:比如十六进制的“0X10”,转换成十进制是“16”,这里要转换成十进制的“10”,面不是“16”
方法如下:
- unsigned int Hex_Conversion(unsigned char ucHexValue)
- {
- /*
- 例子:比如十六进制的“0X10”,转换成十进制是“16”,这里的“16”和“0X10”中间差6,所以要减去一个“6”
- */
- static unsigned char ucConversionTemp = 0;
- switch(ucHexValue&0xf0) //用于判断是在那个段之间
- {
- case 0x00:ucConversionTemp = 0; //不同的段减的值不同,减的值是十六进制与十进制转换差
- break; //找到相应段,就跳出
- case 0x10:ucConversionTemp = 6; //不同的段减的值不同,减的值是十六进制与十进制转换差
- break; //找到相应段,就跳出
- case 0x20:ucConversionTemp = 12; //不同的段减的值不同,减的值是十六进制与十进制转换差
- break; //找到相应段,就跳出
- case 0x30:ucConversionTemp = 18; //不同的段减的值不同,减的值是十六进制与十进制转换差
- break; //找到相应段,就跳出
- case 0x40:ucConversionTemp = 24; //不同的段减的值不同,减的值是十六进制与十进制转换差
- break; //找到相应段,就跳出
- case 0x50:ucConversionTemp = 30; //不同的段减的值不同,减的值是十六进制与十进制转换差
- break; //找到相应段,就跳出
- case 0x60:ucConversionTemp = 36; //不同的段减的值不同,减的值是十六进制与十进制转换差
- break; //找到相应段,就跳出
- case 0x70:ucConversionTemp = 42; //不同的段减的值不同,减的值是十六进制与十进制转换差
- break; //找到相应段,就跳出
- case 0x80:ucConversionTemp = 48; //不同的段减的值不同,减的值是十六进制与十进制转换差
- break; //找到相应段,就跳出
- case 0x90:ucConversionTemp = 54; //不同的段减的值不同,减的值是十六进制与十进制转换差
- break; //找到相应段,就跳出
- }
- uiConValue = ((unsigned int)(ucHexValue-ucConversionTemp)); //计算转换成十进制数据
- return uiConValue; //返回十进制数据
- }
复制代码
|