查看: 907|回复: 5

[未解决] 含16进制IEEE754数据的字符串转换为十进制浮点数

[复制链接]

该用户从未签到

发表于 2019-5-28 23:26 | 显示全部楼层 |阅读模式
本帖最后由 jiangshh 于 2019-5-28 23:27 编辑

  最近接触到一个角度传感器,采用串口读取数据,MCU发送数据请求指令后,传感器的应答数据是遵从IEEE754标准的单精度浮点数,我需要提取出字符串中有效数据,并将16进制表示的字符串转换为浮点型数据,下图是传感器的实用手册。

传感器使用手册

传感器使用手册

自己的NANO板烧了,也没法测试,但是通过网上的String类函数写了一下,不知道呢能否实现功能,或者各位大神有没有更好的写法,我是感觉自己写的有些问题。
下面的我写的程序。


/*
选用传感器的命令格式:
发送读取数据指令后,传感器会应答。
应答的字符例如“01030443870148F18A”
其中43870148是IEEE754标准的单精度浮点数
本程序将16进制IEEE754标准的数据表示为十进制的浮点数
*/

#include <stdlib.h> 
String angle = ""; //用于储存串口读取的字符串
String angle_read = ""; //用于储存提取有效数据后的字符串
const char *angle_date; //用于储存 string类字符串转换为const char类型
float angle_val;//用于储存换算后的浮点数


void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
}

void loop()
{
    Serial.print("01030001000295CB");//给传感器发送的命令
    delay(10);
    
    while (Serial.available() > 0)  //将串口收到的字符储存入angle
    {
        angle += char(Serial.read());
        delay(2);
    }
    
    if (angle.length() > 0)
    {
        angle_read = angle.substring(6,13);//提取angle的含有效数据字符串
        angle_read.trim();//去除字符串前后的空格
        angle_date = angle_read.c_str();//将string类字符串转换为const char类型
        angle_val = atof(angle_date);//将字符串转换为双精度浮点数
        Serial.print(angle_val,2);//串口打印,保留两位小数点
        angle = "";
        angle_read = "";
    }
    
}

该用户从未签到

 楼主| 发表于 2019-5-30 09:11 | 显示全部楼层
本帖最后由 jiangshh 于 2019-5-30 09:14 编辑

这是我修改后的代码,功能已完善,供大家参考试用。

String angle = ""; //用于储存串口读取的字符串
String angle_read = ""; //用于储存提取有效数据后的字符串
String angle_date = ""; //将储存0x与有效字符合并的字符
float angle_val;//用于储存换算后的浮点数

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
}

void loop()
{
    //Serial.println("01030001000295CB");//给传感器发送的命令
    //delay(10);

    while (Serial.available() > 0)  //将串口收到的字符储存入angle
    {
        angle += char(Serial.read());
        delay(2);
    }
    
    if (angle.length() > 0)
    {
        angle_read = angle.substring(6,14);//提取angle的含有效数据字符串
        angle_date = "0x"+angle_read; //将有效字符串前加0x
        char* date = (char*)angle_date.c_str();//将string字符串转换为char*型
        long val = strtol(date,NULL,16);//将char*字符串转化为长整型
        float angle_val = *(float*)&val;//16进制IEEE754标准转化十进制浮点数
        Serial.println(angle_val,2);//串口打印,保留两位小数点
        angle = "";
        angle_read = "";
        angle_date = "";
    }
}
  • TA的每日心情
    擦汗
    2019-7-29 00:08
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2019-5-29 15:44 | 显示全部楼层
    本帖最后由 t3486784401 于 2019-5-29 15:47 编辑

    用 MFC 写了个,LZ 试试看(IEEE754转DEC): F32TODEC.rar (96.24 KB, 下载次数: 13)

    该用户从未签到

     楼主| 发表于 2019-5-30 09:10 | 显示全部楼层
    t3486784401 发表于 2019-5-29 15:44
    用 MFC 写了个,LZ 试试看(IEEE754转DEC):

    运行如下:

    非常感谢你,我是做本科毕业设计,用到这一款传感器,我要用2560多串口采集数据并发送出去,读这款传感器实用手册时上面写道是应答命令用IEEE754标准的浮点数储存方式,所以要写一段程序来转换,经过各种资料查找,今早刚刚写好,我现在发出来供大家以后参考用。还是非常感谢您。

    该用户从未签到

    发表于 2019-7-11 19:22 | 显示全部楼层
    请问如何将float类型转换成IEEE标准的16进制字符串呢,我的需求正好相反,卡了半天了,请教各位大佬
  • TA的每日心情
    擦汗
    2019-7-29 00:08
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2019-7-11 20:17 | 显示全部楼层
    lucas_卢 发表于 2019-7-11 19:22
    请问如何将float类型转换成IEEE标准的16进制字符串呢,我的需求正好相反,卡了半天了,请教各位大佬 ...

    内存里存储的就是 IEEE754 格式的,直接取地址就能访问了
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    SpiderRobot 蜘蛛
    SpiderRobot 蜘蛛
    关于SpiderRobot 项目实行方案 之前有人推荐我做这个项目,于是乎就有了这个 h
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    求助!GM65二维码扫描模块怎么用?
    求助!GM65二维码扫描模块
    求助!GM65二维码扫描模块怎么用? 卖家给的资料真的看不懂该怎么弄。。( ̄▽ ̄)~*
    KPM大比拼
    KPM大比拼
    前言:没别的就是比手快! 方案描述: 做这个的初衷其实是受到一些网红玩具的启发—
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表