关于Modbus数据16进制转10进制问题

4 篇文章 2 订阅

这两天在开发STM32的Modbus主站,就买了一个RS485总线的温湿度传感器来,温湿度传感器说明要求将传感器返回的Modbus报文数据转换为10进制后再除以10得到真实数据,以下是举例

Modbus主站发送报文:
01 04 00 01 00 01 60 0A
意思是读取从站地址01的输入寄存器1号位1位数据

SlaveIDFunctionCodeStartADDRLengthCRC
从站ID功能码起始地址寄存器数量CRC校验
010400 0100 0160 0A

Modbus主站接收报文:
01 04 02 01 2D 78 BD
意思是从站ID为01,功能码为04,数据有两位(一个数据是通过两位来返回),数据高位01,数据低位2D

SlaveIDFunctionCodeLengthDataCRC
从站ID功能码寄存器数量数据CRC校验
01040201 2D78 BD

以上是数据解析

那么问题来了,返回的01 2D怎么变成我们需要的数据
根据传感器说明书,我们需要将返回值变成10进制数据后除以10得到温度值,可以理解为以下流程

合成
转换
除以10
数据01 2D
16进制数据 12D
10进制数据301
温度30.1摄氏度

要做的就是将01 2D转化成30.1这个数字

一开始我还各种骚操作,结果最后发现就很简单,怪自己C语言基础还是有点问题

在计算机中,16进制数字表示的数值和10进制表示的数值其实是一样的,计算上并不存在进制转换问题,存在的是进位的时候是按照10进制进位还是16进制进位

例如:

一个十六进制数2D,以%x形式打印为2d,以%d打印为45
本质上是同一个数

所以在处理Modbus的数据时,设高位为NUM_H,低位为NUM_L,需要的10进制数为Data,高位进位为16的平方,即

Data=NUM_H×16×16+NUM_L

例如2F 3D
计算器转换为10进制为12093
2F代表的10进制为47,3D代表的10进制为61
所以

Data=2F×16×16+3D
	=47×16×16+61
	=12093

所以我接收到的数据01 2D根据公式换算为

Data=01×16×16+2D
	=1×16×16+45
	=301
	
温度=301/10
	=30.1°	

可知我当前室温30.1摄氏度。

所以结论就是,Modbus接收的数据不需要转换进制,只需要进位按照16进制的百位进位既可,也就是16的平方

公式就是:

Data:需要的数据
NUM_H:Modbus数据高位
NUM_L:Modbus数据低位

Data=NUM_H×16×16+NUM_L

因为我说过不给结果的博客都是耍流氓,但是这个结果不好给所以以下是我按照公式计算出来的我的室温和湿度,通过STM32串口发送出来的,当作是结果吧!哈哈哈哈
在这里插入图片描述
我看别人转进制代码都是要钱的,我这里就把公式白给了,很多小白也会遇到这个坑,希望能帮助一下和我以前有一样疑问的人

听说给我点赞评论关注三连的人写代码都不会有BUG!

  • 40
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: Modbus协议是一种通信协议,常用于数字信号的传输。在Modbus协议中,数据的传输格式包含16进制和浮点型两种。如果需要将16进制转换成浮点型,可以通过以下步骤进行: 首先,将16进制数据转换成二进制数据。例如,将16进制数0x4120转换成二进制数为0100000100100000。 接下来,将二进制数据分为三部分:符号位、指数位和尾数位。符号位为第一位,指数位为中间的八位,尾数位为最后的七位。例如,对于上述二进制数,符号位为0,指数位为10010000,尾数位为1000000。 然后,将指数位转换成十进制数。此处为16进制数0x90,转换成十进制为144。 接下来,用指数位的值减去127,得到偏置值。例如,此处的偏置值为144-127=17。 然后,将尾数位转换成十进制数。此处为1000000,转换成十进制为64。 最后,根据指数位的符号,计算出真实值。如果指数位为1,则真实值为-1×2^(偏置值-16)×(1+尾数位/2^7)。如果指数位为0,则真实值为1×2^(偏置值-16)×(0+尾数位/2^7)。例如,对于上述例子,真实值为1×2^(17-16)×(0.78125)=1.5625。 通过以上步骤,即可将Modbus的16进制数据转换成浮点型数据。需要注意的是,在实际应用中,还需要根据数据的精度和位数进行相应的处理。 ### 回答2: 在Modbus通信中,数据以16进制方式进行传输。如果需要将16进制数转换为浮点数,可以按照以下步骤进行: 首先,将16进制数转换为二进制数。可以使用工具或手动计算实现。 然后,根据IEEE 754标准对二进制数进行解析。该标准定义了浮点数的编码方式和解码规则。 对于32位浮点数,它由符号位、指数位和尾数位组成。其中符号位用于表示正负,指数位用于表示科学计数法中的指数部分,尾数位用于表示有效数字的二进制表示。 因此,根据解析规则,可以将二进制数拆分成符号位、指数位和尾数位三部分,并进行计算得到浮点数的值。 需要注意的是,由于Modbus协议在传输数据时,高位字节和低位字节可能会被交换(大端字节序或小端字节序),因此在进行16进制转浮点数操作时,还需要考虑字节序的问题,确保转换结果正确。 总体来说,Modbus16进制转浮点数的过程比较复杂,需要对二进制数和IEEE 754标准有一定的了解,并且需要注意字节序的问题。 ### 回答3: Modbus是一种常用的串行通信协议,用于在工业自动化和控制系统中传输数据。在Modbus协议中,16进制数值被广泛使用,因此在使用Modbus协议进行通信时,经常需要将16进制数值转换为浮点型数据。 要将Modbus协议中的16进制数值转换为浮点型数据,需要以下步骤: 第一步是将16进制数值转换为2进制数值,这可以使用计算机内置的进制转换工具进行转换。例如,我们可以将16进制数值“41A00000”转换为二进制数值“01000001101000000000000000000000”。 第二步是将二进制数值转换为浮点型数据。在IEEE 754标准中,单精度浮点型数据由4个字节组成,其中第一位表示符号位,接下来的8位表示指数,最后的23位表示尾数。因此,在上面的例子中,符号位为“0”,指数为“10000011”,尾数为“01000000000000000000000”。 第三步是根据IEEE 754标准计算出浮点型数据的值。具体计算方式如下: 符号位×2^(指数-127)×(1+尾数×2^-23) 例如,在上面的例子中,符号位为“0”,指数为“10000011”,尾数为“01000000000000000000000”,则浮点型数据的值为: 0×2^(10000011-127)×(1+0.25) = 20.0 因此,“41A00000”在Modbus协议中表示的浮点型数据为20.0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值