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

使用MinimalModbus读取Circutor CVM-1D时遇端口已打开错误求助

解决MinimalModbus串口已打开(SerialException: Port is already open)问题

核心原因

你设置了close_port_after_each_call=True,但执行print(CVM_1D)时,MinimalModbus的对象字符串化操作会自动打开串口获取状态信息,且不会自动关闭,导致后续调用read_float时再次尝试打开串口触发错误。

解决方案

1. 移除或调整串口状态打印操作

直接注释掉print(CVM_1D)语句,避免提前打开串口。如果需要查看仪器配置,可以手动打印关键参数,而不是打印整个对象:

# 手动打印配置信息,替代print(CVM_1D)
print(f"仪器地址: {CVM_1D.address}")
print(f"波特率: {CVM_1D.serial.baudrate}")
print(f"串口模式: {CVM_1D.mode}")

2. 修改代码确保串口正确关闭

使用try-finally块强制保证串口在操作后关闭,即使出现异常:

import minimalmodbus

CVM_1D = minimalmodbus.Instrument('/dev/ttyUSB0', 1)
CVM_1D.mode = minimalmodbus.MODE_RTU
CVM_1D.serial.baudrate = 9600
CVM_1D.serial.bytesize = 8
CVM_1D.serial.parity = minimalmodbus.serial.PARITY_NONE
CVM_1D.serial.stopbits = 1
CVM_1D.serial.timeout = 1
CVM_1D.close_port_after_each_call = True
CVM_1D.clear_buffers_before_each_transaction = True

# 手动打印必要配置,避免触发自动串口打开
print(f"仪器配置: 地址={CVM_1D.address}, 波特率={CVM_1D.serial.baudrate}")

try:
    value = CVM_1D.read_float(0, 4, 2)
    print('Volt:', value)
except Exception as e:
    print(f"读取错误: {str(e)}")
finally:
    # 强制关闭串口
    if hasattr(CVM_1D, 'serial') and CVM_1D.serial.is_open:
        CVM_1D.serial.close()

3. 排查系统串口占用

在Arduino Yun的终端执行以下命令,检查是否有其他进程占用/dev/ttyUSB0:

lsof /dev/ttyUSB0

如果输出有其他进程,使用kill <进程ID>终止该进程后再重试。

4. 验证硬件与参数匹配

  • 确认Circutor CVM-1D的Modbus地址为1,波特率9600,无奇偶校验,1位停止位,和代码配置完全一致
  • 检查RS485接线:A线接A,B线接B,避免接反
  • 确保设备供电正常,RS485适配器工作正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:21:02