树莓派Pico运行CircuitPython时pulseio模块GP7占用报错修复
报错产生原因
ValueError: GP7 in use是CircuitPython引脚资源冲突的典型报错,触发原因如下:
- 你将
pulseio.PulseIn的实例初始化代码放在了while True无限循环块内部 - 程序第一次进入循环时,会正常创建绑定GP7引脚的PulseIn对象,此时GP7引脚被PulseIn外设独占
- 第一次循环执行结束进入第二次循环时,代码会再次尝试创建绑定同一个GP7引脚的PulseIn实例,而此时GP7仍被上一个循环创建的实例占用、未被释放,直接抛出引脚占用错误。
修复方法
将PulseIn的初始化逻辑移到while True循环外部,程序启动时仅初始化一次引脚外设即可,禁止在循环内重复初始化绑定同一引脚的外设对象。
修复后的可正常运行的代码如下:
import board import pulseio import array # 引脚外设初始化移到循环外,程序启动时仅执行一次 ir_read = pulseio.PulseIn(board.GP7, maxlen=100, idle_state=True) while True: # 暂停脉冲采集,避免读取过程中新脉冲写入导致数据错位 ir_read.pause() # 读取当前缓冲区的脉冲数据 command_on = array.array('H', [ir_read[x] for x in range(len(ir_read))]) # 清空缓冲区、恢复采集,准备接收下一组信号 ir_read.clear() ir_read.resume() print(command_on)
补充提示:读取脉冲前后加入暂停、清空、恢复采集的逻辑是pulseio采集红外信号的标准写法,能有效避免数据乱序、长度异常的问题。
内容的提问来源于stack exchange,提问作者Robert_dev
相关产品推荐
相关产品推荐

