树莓派GPIO触发时MQTT Python程序崩溃求助
问题分析与修复方案
我一眼就找到问题所在啦!你的程序每次GPIO触发就崩溃,核心原因是GPIO引脚的初始化步骤犯了一个小错误,导致后续无法正常输出电平。
错误原因详解
错误提示 RuntimeError: The GPIO channel has not been set up as an OUTPUT 已经说得很明确:当执行 GPIO.output(pin, GPIO.LOW) 时,这个引脚并没有被正确配置为输出模式。
看你代码里的这两行:
GPIO.setup(pin, GPIO.OUT) GPIO.setup(pin, GPIO.HIGH)
第一行是完全正确的,把引脚15设置成了输出模式。但第二行直接踩坑了!GPIO.setup() 的第二个参数必须是 GPIO.IN 或 GPIO.OUT(用来指定引脚的输入/输出模式),而你传入了 GPIO.HIGH——这相当于把引脚的模式改成了一个非法值(GPIO.HIGH 本质是数值1,不是合法的模式常量),直接覆盖了之前正确的输出模式设置。这就导致后续调用 GPIO.output 时,系统判定引脚不是输出模式,直接抛出错误崩溃。
修复后的完整代码
把错误的初始化代码改成正确写法,有两种方式可以设置初始电平,选你习惯的就行:
方式一:在setup时直接指定初始电平
#!/usr/bin/env python import paho.mqtt.client as mqtt import RPi.GPIO as GPIO pin = 15 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) # 一次性完成输出模式设置和初始高电平配置 GPIO.setup(pin, GPIO.OUT, initial=GPIO.HIGH) def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.subscribe("/test/light1") def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) # Python2中msg.payload是字节串,直接和字符串对比多数情况能工作 if msg.payload == "0": print("0") GPIO.output(pin, GPIO.LOW) if msg.payload == "1": print("1") GPIO.output(pin, GPIO.HIGH) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("192.168.178.60", 1883, 60) client.loop_forever()
方式二:分开设置模式和初始电平
如果你更习惯分步编写,也可以这样写:
GPIO.setup(pin, GPIO.OUT) # 用output设置初始电平,而不是重复调用setup GPIO.output(pin, GPIO.HIGH)
额外小提示
在Python 2中,msg.payload 返回的是字节串,虽然直接和字符串"0"/"1"对比在大多数场景下能正常工作,但如果遇到编码问题,你可以先解码再对比:msg.payload.decode('utf-8') == "0",这样兼容性更好。
内容的提问来源于stack exchange,提问作者user8144797
相关产品推荐
相关产品推荐

