如何将 MinimalModbus 调试响应存储在变量中?


import serial
import minimalmodbus
import time
instrument = minimalmodbus.Instrument('COM8', 127, debug=True)
instrument.serial.port
instrument.serial.baudrate = 19200
instrument.serial.parity = serial.PARITY_NONE
instrument.serial.bytesize = 8
instrument.serial.stopbits = 1
instrument.mode = minimalmodbus.MODE_RTU
instrument.serial.timeout = 0.300
b = instrument._communicate(b'x7Fx66x01x00x02x00x00x00x01x00', 64)
print(b)
instrument.serial.close()

在终端上,我得到以下内容:

MinimalModbus debug mode. Create serial port COM8
MinimalModbus debug mode. Will write to instrument (expecting 64 bytes back): 7F 66 01 00 02 00 00 00 01 00 (10 bytes)
MinimalModbus debug mode. Clearing serial buffers for port COM8
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1222683890.00 ms, minimum silent period: 2.01 ms.
MinimalModbus debug mode. Response from instrument: 7F 66 01 00 4C 00 00 00 44 54 01 00 20 00 44 54 CB 74 14 43 AD B2 15 43 00 00 FA 44 00 94 9E 41 88 6D 08 00 88 6D 08 00 00 00 00 00 1A AB C3 40 45 A5 70 42 54 60 99 45 CF C4 03 00 00 00 00 00 (64 bytes), roundtrip time: 0.0 ms. Timeout for 
reading: 300.0 ms.
b'x7ffx01x00Lx00x00x00DTx01x00 x00DTxcbtx14Cxadxb2x15Cx00x00xfaDx00x94x9eAx88mx08x00x88mx08x00x00x00x00x00x1axabxc3@Exa5pBT`x99Excfxc4x03x00x00x00x00x00'

打印 b 时,数据与仪器数据的响应不同。我假设它被一些噪音扭曲了。只有原始数据存储在 b 中。如何获得实际数据,就像存储在变量 b 中的仪器的响应一样?

我认为它被一些噪音扭曲了。

不 - 这只是你输出它的方式;如果你不为它提供一种格式print输出"正式字符串表示"(见str())。7f不可打印,因此输出7f66=f,因此输出f01不可打印,因此输出1等。

这可以通过以下方法进行演示:

sampleBytes = bytes(bytearray.fromhex('7F 66 01 00 4C 00 00 00 44 54 01 00 20 00 44 54 CB 74 14 43 AD B2 15 43 00 00 FA 44 00 94 9E 41 88 6D 08 00 88 6D 08 00 00 00 00 00 1A AB C3 40 45 A5 70 42 54 60 99 45 CF C4 03 00 00 00 00 00'))
print(sampleBytes)
print(" ".join([f"{x:02X}" for x in sampleBytes]) + " ({} bytes)".format(
len(sampleBytes)
))

这将产生:

b'x7ffx01x00Lx00x00x00DTx01x00 x00DTxcbtx14Cxadxb2x15Cx00x00xfaDx00x94x9eAx88mx08x00x88mx08x00x00x00x00x00x1axabxc3@Exa5pBT`x99Excfxc4x03x00x00x00x00x00'
7F 66 01 00 4C 00 00 00 44 54 01 00 20 00 44 54 CB 74 14 43 AD B2 15 43 00 00 FA 44 00 94 9E 41 88 6D 08 00 88 6D 08 00 00 00 00 00 1A AB C3 40 45 A5 70 42 54 60 99 45 CF C4 03 00 00 00 00 00 (64 bytes)

因此,您所看到的是预期的结果,并且您已经拥有了所需的数据。请注意,上面的第二个print使用MinimalModbus用于输出"来自仪器的响应"的代码;看这里和这里。