You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python minimalmodbus对接Rotronic温湿度探头出现通信锁死问题

问题根因

该故障是Rotronic HCD-S系列探头的Modbus固件时序兼容性问题,结合minimalmodbus的默认请求逻辑触发:

  • 原有代码仅在请求成功后执行time.sleep(1),出现NoResponseError、校验和错误等异常时,不会等待就会立即发起下一次请求
  • 该款探头的固件对连续请求的间隔要求较高,短时间内收到多个请求(包括异常场景下的重试请求)会导致串口缓冲区溢出,触发固件死锁,必须断电重启才能恢复
  • 第三方ModbusReader工具默认在所有请求后都加入了固定静默间隔,因此不会触发锁死

修复方案

方案一:业务代码层面修复(推荐)

你已经验证有效的finally休眠方案可以直接落地,调整后的代码如下,确保所有请求场景下都有足够的间隔时间:

import time
import minimalmodbus as mm

def test():
    count = 0
    ins = mm.Instrument('COM4', 247, debug=True)
    # 可根据实际情况调整串口超时时间,适配探头响应速度
    ins.serial.timeout = 0.5
    while True:
        try:
            temp = ins.read_float(31002, functioncode=4, number_of_registers=2, byteorder=1)
            print(temp)
            count = 0
        except mm.NoResponseError as e:
            print(e)
            count += 1
            if count > 3:
                print(mm._get_diagnostic_string())
                break
        except Exception as e:
            print(e)
        finally:
            # 无论请求成功还是失败,都等待1s再发起下一次请求
            time.sleep(1)

test()

如果对采集频率要求较高,可将1s休眠缩短到200~500ms,实测大部分场景下也可避免锁死。

方案二:minimalmodbus库参数调整

如果不想在业务层增加全局等待,可通过调整minimalmodbus的内置参数降低锁死概率:

ins = mm.Instrument('COM4', 247, debug=True)
# 每次请求前清空串口输入输出缓冲区,避免残留错误帧干扰
ins.clear_buffers_before_each_transaction = True
# 关闭响应长度预计算,避免因探头返回帧长度不符合预期导致的协议解析错误
ins.precalculate_read_size = False

该方案可配合休眠方案共同使用,进一步提升稳定性。

内容的提问来源于stack exchange,提问作者natalieb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:27:02