如何将MinimalModbus调试响应存储为变量并获取原始响应数据?
问题:如何将MinimalModbus调试信息中的仪器响应数据正确存储到变量?
我的Python代码
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'\x7F\x66\x01\x00\x02\x00\x00\x00\x01\x00', 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'\x7ff\x01\x00L\x00\x00\x00DT\x01\x00 \x00DT\xcbt\x14C\xad\xb2\x15C\x00\x00\xfaD\x00\x94\x9eA\x88m\x08\x00\x88m\x08\x00\x00\x00\x00\x00\x1a\xab\xc3@E\xa5pBT`\x99E\xcf\xc4\x03\x00\x00\x00\x00\x00'
解答
首先明确:调试信息里的响应和变量b的内容完全一致,只是显示格式不同。调试日志用十六进制字节展示,而print(b)会把ASCII可打印字符直接输出(比如0x66显示为'f'、0x4C显示为'L'),非可打印字节用转义序列表示(比如0xCB显示为'\xcb')。
如果需要把b转换成和调试日志一致的格式存储或验证,可参考以下方法:
1. 转换为十六进制字符串格式(与调试日志匹配)
用列表推导式遍历字节串,将每个字节格式化为两位大写十六进制字符,再用空格拼接:
# 将字节串b转换为调试日志风格的十六进制字符串 hex_response = ' '.join(f'{byte:02X}' for byte in b) print(hex_response) # 可以将hex_response存入变量长期保存
执行后输出的就是和调试日志里完全相同的7F 66 01 00 4C ...格式内容。
2. 直接验证字节内容一致性
如果要确认单个字节是否和调试日志一致,可直接通过索引访问:
# 调试日志第一个字节是0x7F,对应b[0] print(hex(b[0])) # 输出0x7f # 调试日志第二个字节是0x66,对应b[1] print(hex(b[1])) # 输出0x66
逐个对比即可确认数据是否一致,排除干扰疑虑。
3. 若确实怀疑数据干扰
如果转换后的十六进制字符串和调试日志不一致,再排查串口通信问题:
- 检查线缆连接是否牢固、有无电磁干扰
- 确认串口参数(波特率、奇偶校验、停止位等)与仪器完全匹配
- 尝试调整串口超时时间或增加通信前的延迟
内容的提问来源于stack exchange,提问作者Isaac Zaiek
相关产品推荐
相关产品推荐

