在使用ModBus的时候,遇到了需要传输小数的问题,在网上搜索一般有两种方法:
- 当量转换(发送端放大(*100)接收端缩小(/100))
- IEEE 754标准
我们直接不使用第一种,毕竟有些损(如数值被损),但是如果要求没那么高,第一种也不妨是合适的解决方法。
基础认识:
IEEE 754:
- 符号位
- 阶码
- 尾数
32位IEEE 754:1位符号 + 8位阶码 + 23位尾数
64位IEEE 754:1位符号 + 11位阶码 + 52位尾数
有了符号位、阶码、尾数就可以把32位或64位的二进制数转换成对应的小数了
直接上例子:
小数:
-255.5
对应的32位二进制数:
1(符号位)100 0011 0(阶码)111 1111 1000 0000 0000 0000(尾数)
先看符号位:1 表示负数。
阶码:10000110 是 134, 减去 127 才是真正的阶码。134 - 127 = 7。
尾数:111 1111 1000 0000 0000 0000。需要在前端加上”1.“得到二进制小数 1.111 1111 1000 0000 0000 0000。
二进制小数按照阶码正负,右左移动,这里阶码为7,二进制小数的小数点右移 7个,1111 1111. 1000 0000 0000 0000
转换成十进制加上符号就是对应小数(2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^