在python中从从机提取有效负载

在python中从从机提取有效负载,python,python-3.x,pyserial,rs485,minimalmodbus,Python,Python 3.x,Pyserial,Rs485,Minimalmodbus,我使用minimalmodbus与使用rs485协议的micro motion流量计通信,我使用usb-rs485转换器。此处提供micro motion modbus文档 当我使用此代码从2个寄存器读取浮点数时 import minimalmodbus minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL=True import serial instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) ins

我使用minimalmodbus与使用rs485协议的micro motion流量计通信,我使用usb-rs485转换器。此处提供micro motion modbus文档

当我使用此代码从2个寄存器读取浮点数时

import minimalmodbus
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL=True
import serial
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) 
instrument.serial.baudrate = 9600
instrument.serial.timeout = 1
instrument.serial.baudrate = 9600  
instrument.serial.bytesize = 8
instrument.serial.parity   = serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout  = 0.05   
instrument.mode = minimalmodbus.MODE_RTU
instrument.debug = True
try:
    values = instrument.read_float(250, 3, 2) 
    print (values)
except IOError:
    print("Failed")
values = read_registers(3924, numberOfRegisters=2)
registerstring = chr(values[2]) + chr(values[3]) + chr(values[0]) + chr(values[1])
floatvalue = minimalmodbus._bytestringToFloat(registerstring)
它给了我这样的回答:

MinimalModbus debug mode. Writing to instrument (expecting 9 bytes back): '\x01\x03\x00ú\x00\x02ä:' (01 03 00 FA 00 02 E4 3A)
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1502310315020.7 ms, minimum silent period: 4.01 ms.
MinimalModbus debug mode. Response from instrument: '\x01\x03\x04\x9f3Aâ\x941' (01 03 04 9F 33 41 E2 94 31) (9 bytes), roundtrip time: 28.8 ms. Timeout setting: 50.0 ms.

-3.7959221374830406e-20
应该是29.879或29.78687之类的。这是由于bytestring的顺序。这里给出了一个解决方法。

正如它使用此代码编写的那样

import minimalmodbus
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL=True
import serial
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) 
instrument.serial.baudrate = 9600
instrument.serial.timeout = 1
instrument.serial.baudrate = 9600  
instrument.serial.bytesize = 8
instrument.serial.parity   = serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout  = 0.05   
instrument.mode = minimalmodbus.MODE_RTU
instrument.debug = True
try:
    values = instrument.read_float(250, 3, 2) 
    print (values)
except IOError:
    print("Failed")
values = read_registers(3924, numberOfRegisters=2)
registerstring = chr(values[2]) + chr(values[3]) + chr(values[0]) + chr(values[1])
floatvalue = minimalmodbus._bytestringToFloat(registerstring)
或者类似的,我们可以将字节顺序设置正确,以获得正常的输出

values = read_registers(3924, numberOfRegisters=2)
返回单整数,若你们读了2个寄存器,它将在列表中给出2个值

[61552, 16865]
我应该如何让bytestring设置正确的顺序。现在,我的问题是如何从从属服务器保存有效负载。我想将这个字节字符串保存到变量中的'\x01\x03\x04\x9f3A–x941',以便更改字节顺序。并将其传递给 _bytestringToFloat()
所以我可以得到一个实际值。我是新手,请帮忙。

使用
struct.pack
struct.unpack
将整数转换为bytestring,再转换为float

import struct

r=[61552, 16865]
b=struct.pack('HH',r[0],r[1])

>>> b'p\xf0\xe1A'

struct.unpack('f',b)[0]

>>> 28.242401123046875