单片机中16进制与浮点数互换

原创 2016年08月30日 16:26:14

@(攻城狮)[单片机,数据传输]
声明:
本文内容主要参考
十六进制 浮点数格式
单片机传递浮点数方法

对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数),
1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示;
2、第30~23 bit为幂数,其读数值用e表示;
3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x;

用数学公式表示为:
(1)s(1+x)2(e127)

举个例子:
16进制:49E48E68
2进制:0100 1001 1110 0100 1000 1110 0110 1000
从右往左数,分别是第0位,第1位,……,第31位

那么
- 第31位是0,即s=0;
- 第30~23位依次是 10010011,转换成10进制是147,也就是说e=147
- 第22~0位依次是11001001000111001101000,是二进制纯小数,即0.11001001000111001101000,其10进制形式为0.78559589385986328125,也就是说x=0.78559589385986328125

说明:一个二进制数:abc.def=a22+b21+c20+d2(1)+e2(2)+f2(3)
- 最后,该浮点数的10进制表示

(1)s×(1+x)×2e127=(1)0×(1+0.78559589385986328125)×2147127=1872333

在单片机的处理中,通常有三种方法进行浮点数的传输:
- 将浮点数转化为整数,然后传递整数的ascII码形式;
- 进行编码,这个暂时我是这样理解的,比方说a=7.345678这样的浮点数,可以进行编码 成一个帧数据 帧头 +数据位+ 整数编码+加小数点+小数编码,具体的解码方法是:a/1取整,得到整数7,然后再添加一个小数点编码!(如0x55),然后再用a-7得到小数部分,然后将小数扩大10倍。再取整然后继续进行取整,以此类推将
- 第三种方法也是利用内存,不用知到浮点数的具体编码方式,因为在单片机中浮点数占4个字节,就知道这一点就可以了,我们可以采用联合体的方式。

显然,第三种方法更好,不会带来更多的编解码负担。
直接上代码:

#include<iostream>
#include<string.h>
using namespace std;

float hexTofloat(char* test);
union data
{
    float out;
    char in[4];
}temp;
int main(void)
{
    temp.in[0] =0X00;
    temp.in[1] =0X58;
    temp.in[2] =0X7F;
    temp.in[3] =0XBF;
    cout << temp.out << endl;
    getchar();
    return 0;
}

直接运行后,屏幕上会显示:-0.997437
(加速度计的z轴数据,单位:g,数据来源于curs2传感器)

关于程序的理解,可以查阅关于联合体的定义与使用,因为浮点数占用四个字节,那我们就直接把存放这四个字节的地址中的内容拿出来发送出去就可以了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

C51浮点数显示、浮点数表示方法

C51中的浮点数存储方式 --n年前曾在c51bbs论坛中发布过 Float 浮点形,它是符合IEEE-754标准的单精度浮点形数据,在十进制中具有7位有效数字。FLOAT型据占用四个字节(32位...
  • liang890319
  • liang890319
  • 2013年10月10日 10:29
  • 5066

MODBUS协议 IEEE32位二进制浮点数与十进制小数转换的方法等内容

IEEE标准的32位浮点数转换为十进制的计算方法   下面是用笔记本电脑的MODTEST软件在COM 1口经232转485转换器转变为485口后连接到流量计算机,通过MODBUS协议读取到...
  • action20
  • action20
  • 2014年01月01日 19:08
  • 2695

单精度浮点数与十六进制转换_C语言程序

  • 2012年08月24日 09:21
  • 2KB
  • 下载

32位,16位浮点数转化,浮点数二进制转化

  • 2016年08月03日 20:03
  • 1.81MB
  • 下载

浮点数据与4个单字节的转换

前言: 在串口、IIC、SPI等数据传送时基本上都是一次传送一个字节的数据,如果要传送浮点数据? 通常是将浮点数乘以一个倍数,如10,100,1000,10000等,然后将其转换为整型数据再转化为...
  • ls667
  • ls667
  • 2016年03月05日 23:57
  • 5862

浮点数字符串转换成浮点数实现(2)

其实几年前实现过一个面试题版本的,参考:浮点数字符串转换成浮点数实现。 最近因为工作的关系又拿了出来,做了一些简单的修改,支持了前端空格处理,溢出检测等等,当然精度处理这个难度有点大...
  • magictong
  • magictong
  • 2015年07月28日 23:23
  • 3389

android 2、10、16进制相互转换源代码

  • 2013年10月06日 21:12
  • 988KB
  • 下载

单片机传递浮点数方法

今天突然用到了用单片机和上位机进行传递浮点数方法是这样的。 1.将浮点数转化为整数,然后传递整数的ascII码形式。 2.进行编码,这个暂时我是这样理解的,比方说a=7.345678这样的浮点数。 可...
  • zhanghuaichao
  • zhanghuaichao
  • 2016年03月20日 11:52
  • 847

C# 四个字节十六进制数和单精度浮点数之间的相互转化

即是所谓的IEEE754标准,这也是大多数硬件存储浮点数的标准。单精度浮点数占4个字节,表示范围为:在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1....
  • kjlrzzyffmx
  • kjlrzzyffmx
  • 2015年10月11日 21:51
  • 9641

浮点数和十六进制之间的相互转换

浮点数和十六进制编码的转换
  • jardinier
  • jardinier
  • 2015年04月11日 02:49
  • 2825
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单片机中16进制与浮点数互换
举报原因:
原因补充:

(最多只允许输入30个字)