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

