使用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
相关产品推荐
相关产品推荐

