使用pyfirmata读取Arduino Mega模拟值二次运行异常问题咨询
问题原因及解决办法
原因
这不是正常行为,核心问题是第一次运行结束后,串口连接与Firmata迭代器未被正确关闭释放。当不重启内核二次运行代码时,之前的串口连接仍处于占用状态,新代码尝试重新建立连接和迭代器时,会引发Firmata通信状态混乱——比如协议会话未重置、引脚报告模式冲突,最终读取到的是类似引脚浮空的无效随机值。
解决办法
修改代码,在程序结束时显式关闭迭代器与板卡连接,确保串口资源被完全释放:
import serial import serial.tools.list_ports from pyfirmata import ArduinoMega, util from time import sleep def readArduinoPort(): COM = [] ports = list(serial.tools.list_ports.comports()) for p in ports: if "Arduino" in p.description: COM.append(str(p.device)) return COM COM = readArduinoPort() board = ArduinoMega(COM[0]) pin = board.get_pin('a:5:i') it = util.Iterator(board) it.start() try: while True: print(pin.read()) sleep(0.1) except KeyboardInterrupt: pass finally: # 显式关闭迭代器和板卡连接 it.stop() board.exit()
补充说明
你之前尝试的enable_reporting()/disable_reporting()无效,是因为问题不在引脚报告模式本身,而是整个Firmata通信会话的状态未被重置——旧的串口连接残留导致新指令无法正常与Arduino交互。加上finally块里的关闭操作后,每次运行结束都会彻底清理资源,二次运行时就能重新建立正常的通信链路。
内容的提问来源于stack exchange,提问作者dcupolillo
相关产品推荐
相关产品推荐

