打印
[C语言]

请教浮点数如何转成四字节十六进制

[复制链接]
3688|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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  

请问是哪里有问题呢

QQ截图20151016233943.png (35.13 KB )

QQ截图20151016233943.png

相关帖子

沙发
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

使用特权

评论回复
5
chest20090909|  楼主 | 2015-10-17 10:49 | 只看该作者
之前上面写错了,不是42 9D 33 00,而是42 5A CD 00,得到的结果与转换软件的值还是有差异

使用特权

评论回复
6
457344370| | 2015-10-17 16:31 | 只看该作者
估计是大小端的问题

使用特权

评论回复
7
coody| | 2015-10-17 21:39 | 只看该作者
简单啊,强制指针转换。类似的用法很多,串口收发是一种,还有把浮点数按字节保存到EEPROM、读出等等。

使用特权

评论回复
8
chest20090909|  楼主 | 2015-10-19 09:08 | 只看该作者
coody 发表于 2015-10-17 21:39
简单啊,强制指针转换。类似的用法很多,串口收发是一种,还有把浮点数按字节保存到EEPROM、读出等等。 ...

请教如何强制指针转换

使用特权

评论回复
9
xuyaqi| | 2015-10-20 11:08 | 只看该作者
没有看到楼主的程序不好判断。

使用特权

评论回复
10
受不了了| | 2015-10-20 11:56 | 只看该作者
首先要保证收发自如,再来调试其他的,不过好像又不容易判断自己是否真的达到了收发自如那境界;P

使用特权

评论回复
11
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;
        }
}


使用特权

评论回复
12
xuyaqi| | 2015-10-20 16:25 | 只看该作者
chest20090909 发表于 2015-10-20 13:16
测试程序就是串口发送指令
union
{

楼主:是真实单片机还是仿真?

使用特权

评论回复
13
ayb_ice| | 2015-10-20 17:07 | 只看该作者
chest20090909 发表于 2015-10-20 13:16
测试程序就是串口发送指令
union
{

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

要么是0123,要么是3210

使用特权

评论回复
14
chest20090909|  楼主 | 2015-10-20 17:17 | 只看该作者
xuyaqi 发表于 2015-10-20 16:25
楼主:是真实单片机还是仿真?

仿真和实际电路都试过,结果是一样的

使用特权

评论回复
15
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

使用特权

评论回复
16
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的顺 ...

那说明你的程序有问题
或者是其它地方有问题
其实先发谁,后发谁都无所谓的,只要收发双方一致就可以了

使用特权

评论回复
17
millenniumm| | 2015-10-21 07:53 | 只看该作者
pic用的24位float格式,和标准32位不同

使用特权

评论回复
18
ayb_ice| | 2015-10-21 08:14 | 只看该作者
millenniumm 发表于 2015-10-21 07:53
pic用的24位float格式,和标准32位不同

对啊没有注意用的是PIC MCU,是非标准的浮点数

使用特权

评论回复
19
supertankhzt| | 2015-10-21 15:41 | 只看该作者
端序问题,既然还是非标准浮点数,精相比32位要差了,建议还是用一个Long来传,要保留两位小数就乘上100,上位机也处理一下就好了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

121

主题

632

帖子

4

粉丝