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

如何使用Python Fire库操作串口并保持COM口持续打开?

如何让Fire执行命令后保持串口打开?

我编写了一个用于控制串口GPIO的Russ_GPIO类,使用fire库实现命令行交互,但执行python ComPort.py set_gpio 0时,串口刚打开就会立刻关闭——因为fire执行完指定方法后,类实例会被销毁,串口连接也随之关闭。怎么才能让串口保持打开状态?

原代码如下:

import sys
import serial
import fire


from serial import Serial


class Russ_GPIO(object):
    def __init__(self, port="COM4")
        self.com4 = serial.Serial("COM4", baud, rtscts=False, dsrdtr=False, timeout=timeout, parity=parity)
        time.sleep(0.5)

        self.com4.rts = False


    
    def set_gpio(self, state ):
        if state == 0: 
            self.com4.rts = False                       
        else:
            self.com4.rts = True  
        

if __name__ == '__main__':
    fire.Fire(Russ_GPIO)

解决方法

核心思路是让程序在执行完GPIO设置后不立即退出,从而保持类实例和串口连接的存在。这里提供两种可行方案:

方案1:添加阻塞方法,主动保持程序运行

给Russ_GPIO类添加一个用于阻塞程序的方法,执行完set_gpio后调用该方法,让程序持续运行直到手动终止。同时修复原代码中缺失的参数和语法问题:

import sys
import serial
import fire
import time  # 补上缺失的time模块导入

from serial import Serial


class Russ_GPIO(object):
    def __init__(self, port="COM4", baud=9600, timeout=1, parity='N'):
        # 补全串口参数的默认值,同时使用传入的port参数而非硬编码"COM4"
        self.ser = serial.Serial(port, baud, rtscts=False, dsrdtr=False, timeout=timeout, parity=parity)
        time.sleep(0.5)
        self.ser.rts = False

    def set_gpio(self, state):
        # 简化判断逻辑
        self.ser.rts = False if state == 0 else True
        print(f"GPIO状态已设置为{state},RTS引脚状态:{self.ser.rts}")

    def hold(self):
        """保持程序运行,按Ctrl+C退出并关闭串口"""
        print("串口已保持打开,按Ctrl+C可退出程序并关闭串口...")
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            print("\n正在关闭串口...")
            self.ser.close()
            print("串口已关闭")


if __name__ == '__main__':
    fire.Fire(Russ_GPIO)

执行命令时,在set_gpio后追加调用hold方法:

python ComPort.py set_gpio 0 hold

程序会在设置完GPIO后进入阻塞状态,直到你按下Ctrl+C,此时会自动关闭串口并退出。

方案2:使用Fire的交互模式

Fire支持直接进入类的交互REPL模式,此时类实例会一直存在,串口也会保持打开。直接执行以下命令:

python ComPort.py

进入交互环境后,你可以随时调用set_gpio方法修改GPIO状态:

>>> set_gpio(0)
>>> set_gpio(1)

退出交互模式时(按Ctrl+D或输入exit()),串口会自动关闭。

补充说明

原代码存在几个语法和逻辑问题,已在修改后的代码中修复:

  • __init__方法定义末尾缺失冒号
  • 未导入time模块却调用了time.sleep
  • 硬编码了串口端口"COM4",未使用传入的port参数
  • baud、timeout、parity等参数未定义默认值,运行会触发NameError

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:38