[C语言] 请教浮点数如何转成四字节十六进制

[复制链接]
4226|18
 楼主| chest20090909 发表于 2015-10-16 23:01 | 显示全部楼层 |阅读模式
本帖最后由 chest20090909 于 2015-10-17 10:43 编辑

想通过串口传送浮点数,所以想把浮点数转成四个字节依次发送,但不知道浮点数如何转成四字节十六进制数呢
我定义了一个联合体
union
{
        float f;
        uchar d[4];
}fd;


fd.f=54.7;
然后依次发送d[0],d[1],d[2],d[3]
用转换器软件查得54.7的十六进制是42 5A CC CD


但用仿真软件得到的是 CD 5A 42 00  

请问是哪里有问题呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| chest20090909 发表于 2015-10-17 00:21 | 显示全部楼层
本帖最后由 chest20090909 于 2015-10-17 10:47 编辑

如果按d[2],d[1],d[0],d[3]来传送,得到42 5A CD 00,为什么最后一字节是00呢
用转换软件查看42 5A CD 00的浮点数是54.700195

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ayb_ice 发表于 2015-10-17 08:38 | 显示全部楼层
chest20090909 发表于 2015-10-17 00:21
如果按d[2],d[1],d[0],d[3]来传送,得到42 9D 33 00,为什么最后一字节是00呢

应该是通信程序的问题

连续发送0~255测试一下
 楼主| chest20090909 发表于 2015-10-17 09:39 | 显示全部楼层

这是连续发送0-255

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| chest20090909 发表于 2015-10-17 10:49 | 显示全部楼层
之前上面写错了,不是42 9D 33 00,而是42 5A CD 00,得到的结果与转换软件的值还是有差异
457344370 发表于 2015-10-17 16:31 来自手机 | 显示全部楼层
估计是大小端的问题
coody 发表于 2015-10-17 21:39 | 显示全部楼层
简单啊,强制指针转换。类似的用法很多,串口收发是一种,还有把浮点数按字节保存到EEPROM、读出等等。
 楼主| chest20090909 发表于 2015-10-19 09:08 | 显示全部楼层
coody 发表于 2015-10-17 21:39
简单啊,强制指针转换。类似的用法很多,串口收发是一种,还有把浮点数按字节保存到EEPROM、读出等等。 ...

请教如何强制指针转换
xuyaqi 发表于 2015-10-20 11:08 | 显示全部楼层
没有看到楼主的程序不好判断。
受不了了 发表于 2015-10-20 11:56 | 显示全部楼层
首先要保证收发自如,再来调试其他的,不过好像又不容易判断自己是否真的达到了收发自如那境界;P
 楼主| chest20090909 发表于 2015-10-20 13:16 | 显示全部楼层
测试程序就是串口发送指令
union
{
        float f;
        uchar d[4];
}fd;
void send_temperature1()
{
        fd.f=54.7;
        if(work_status==1)
        {
                TXREG=fd.d[2];
                while(!TRMT);
                TXREG=fd.d[1];
                while(!TRMT);
                TXREG=fd.d[0];
                while(!TRMT);
                TXREG=fd.d[3];
                while(!TRMT);
                work_status=0;
        }
}


xuyaqi 发表于 2015-10-20 16:25 | 显示全部楼层
chest20090909 发表于 2015-10-20 13:16
测试程序就是串口发送指令
union
{

楼主:是真实单片机还是仿真?
ayb_ice 发表于 2015-10-20 17:07 | 显示全部楼层
chest20090909 发表于 2015-10-20 13:16
测试程序就是串口发送指令
union
{

怎么会按2,1,0,3顺序发呢

要么是0123,要么是3210
 楼主| chest20090909 发表于 2015-10-20 17:17 | 显示全部楼层
xuyaqi 发表于 2015-10-20 16:25
楼主:是真实单片机还是仿真?

仿真和实际电路都试过,结果是一样的
 楼主| chest20090909 发表于 2015-10-20 17:25 | 显示全部楼层
ayb_ice 发表于 2015-10-20 17:07
怎么会按2,1,0,3顺序发呢

要么是0123,要么是3210

如果按0123的顺序发送,发出的是CD 5A 42 00,用软件查对应的浮点数是-228859904.000000

如果按3210的顺序发送,发出的是00 42 5A CD 用软件查对应的浮点数是0.000000


只有按2103的顺序发出的是42 5A CD 00 对应的浮点数是54.700195,才接近要发送的浮点数54.7

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ayb_ice 发表于 2015-10-20 17:29 | 显示全部楼层
本帖最后由 ayb_ice 于 2015-10-20 18:29 编辑
chest20090909 发表于 2015-10-20 17:25
如果按0123的顺序发送,发出的是CD 5A 42 00,用软件查对应的浮点数是-228859904.000000

如果按3210的顺 ...

那说明你的程序有问题
或者是其它地方有问题
其实先发谁,后发谁都无所谓的,只要收发双方一致就可以了
millenniumm 发表于 2015-10-21 07:53 | 显示全部楼层
pic用的24位float格式,和标准32位不同
ayb_ice 发表于 2015-10-21 08:14 | 显示全部楼层
millenniumm 发表于 2015-10-21 07:53
pic用的24位float格式,和标准32位不同

对啊没有注意用的是PIC MCU,是非标准的浮点数
supertankhzt 发表于 2015-10-21 15:41 | 显示全部楼层
端序问题,既然还是非标准浮点数,精相比32位要差了,建议还是用一个Long来传,要保留两位小数就乘上100,上位机也处理一下就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

121

主题

632

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部