21ic电子技术开发论坛
标题:
十六进制和浮点数之间的运算
[打印本页]
作者:
wyjie
时间:
2019-6-15 15:33
标题:
十六进制和浮点数之间的运算
小弟最近在写MODBUS协议程序,遇到十六进制和浮点数之间的运算问题
作者:
zhanghqi
时间:
2019-6-15 15:36
楼主详细说说怎么回事啊,这么说太笼统了
作者:
wyjie
时间:
2019-6-15 15:38
假如我发送一查询请求:01 03 00 00 00 02 CRC
然后收到应答帧: 01 03 04 08 22 38 4E CRC
我需要的数据是 08 22 38 4E,转换成10进制就是8345678,因为MODBUS协议是十六进制数据传输的,但是我希望处理成浮点数 83456.78,请问我该怎么处理,谢谢了!
作者:
shimx
时间:
2019-6-15 15:42
定点处理。
作者:
jlyuan
时间:
2019-6-15 15:46
正解
作者:
dengdc
时间:
2019-6-15 15:50
先是把这些十六进制的数通过移位处理的换算成32位的数的就可以的。。
作者:
heweibig
时间:
2019-6-15 15:53
然后再将该数值的除以100的,需要强制转换成浮点数的啊,即float型或者double型的即可。
作者:
lizye
时间:
2019-6-15 15:56
这个是不算复杂的哦,先设置一个32位的长整型变量的,将这些十六进制数通过算法规整到一块的,再将其强制到float型的数据的也可以的。
作者:
liliang9554
时间:
2019-6-15 16:04
你说的这个什么运算关系?
作者:
lizye
时间:
2019-6-15 16:07
这个之间的运算没有什么关系,直接转换就行吧。
作者:
wyjie
时间:
2019-6-15 16:10
设置一个32位的长整型变量的,将这些十六进制数通过算法规整到一块的,再将其强制到float型的数据
作者:
午夜粪车
时间:
2019-6-15 16:13
是字符串之间的转换吗?
作者:
huangchui
时间:
2019-6-15 16:18
看看sprintf试试。
作者:
jiajs
时间:
2019-6-15 16:22
设置一个32位的长整型变量的,将这些十六进制数通过算法规整到一块的,再将其强制到float型的数据
作者:
heweibig
时间:
2019-6-15 16:28
这个是专门有相关的算法可以采用的
作者:
wuhany
时间:
2019-6-15 16:28
看样子楼主只是简单的了解了一些modbus基础知识,但是不够系统和全面。
其实,modbus虽然比较简单,但是如果不注意有很多坑,
特别是寄存器的位数,大小端处理,浮点数,长整数的处理等等。
目前也没有什么合适的书籍系统介绍,帮助理解的。
刚刚搜了一下,只有最近清华出版的《Modbus软件开发实战指南》不错,
应该是Modbus开发方面第一书,很系统很全面,各种代码都是开源的。
内容着重讲述如何快速入门并精通Modbus软件开发技术,
适用于初学Modbus通信协议的读者,可以看看。
作者:
wuhany
时间:
2019-6-15 16:30
不用转换啊,你应该问的是高低位字节序的问题。
本来浮点数是4个字节,这4个字节存放到Modbus中,需要2个Modbus地址的寄存器。
这样就存在高低位、字节序的问题。
假设浮点数4个字节分别是A B C D, 如果存放到Modbus寄存器的时候,以BA DC方式的话,
读取的时候,需要交换字节序,否则就乱套了。
当然,具体存放方法编程者可以自己定义,但是Master和Slave端必须统一了。
作者:
huangchui
时间:
2019-6-15 16:33
遇到换算问题么?
运算遇到什么问题了?
作者:
lizye
时间:
2019-6-16 09:21
另外一个,分享一个学Modbus必备:
http://www.binaryconvert.com/convert_float.html
任意数的十进制和16进制互转工具
作者:
dengdc
时间:
2019-6-16 09:25
遇到的MODBUS的什么问题?
作者:
wuhany
时间:
2019-6-16 09:28
十六进制和浮点数之间的运算有什么问题?
作者:
lizye
时间:
2019-6-16 09:31
寄存器的位数,浮点数,长整数的处理要注意的
作者:
wuhany
时间:
2019-6-16 09:34
楼主也没有说遇到什么问题了
IEEE标准的32位浮点数?
作者:
jiahy
时间:
2019-6-16 09:43
你的代码看一下,转换很难吗
作者:
wuhany
时间:
2019-6-16 09:46
这个可以在21ic下载modbus的程序。
作者:
spark周
时间:
2019-6-16 09:49
是高低位字节序的问题。
作者:
zhenykun
时间:
2019-6-16 09:52
这个是有相关的转换算法的
作者:
zhaoxqi
时间:
2019-6-16 09:55
将40800000转换为10进制数,方法如下:
Modbus浮点数转换示例
Modbus浮点数转换示例
先将16进制数转成二进制数01000000100000000000000000000000
1位符号位(SIGN)=0
8位指数位(EXPONENT)=10000001=129[10进制]
23位尾数位(MANTISSA)=00000000000000000000000
1.尾数=1 .00000000000000000000000=1.0000000[10进制]
套入公式得SGL=(-1)^0*1.0000000*2^(129-127)=4
作者:
jiahy
时间:
2019-6-16 10:16
VB转换方法:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) ‘定义
Dim A(3) As Byte
Dim d As Single
A(0)=&H00
A(1)=&H00
A(2)=&H80
A(3)=&H40
CopyMemory d, A(0), 4
' 结果d=4
作者:
lizye
时间:
2019-6-16 10:20
遇到什么问题?不能转换?
这个都在modbus协议里面有。
作者:
wyjie
时间:
2019-6-16 10:24
结贴了,多谢大家讨论这么多哈,呵呵
欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/)
Powered by Discuz! X3.5