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

树莓派4:通过字典键控制RPI.GPIO引脚报错排查

树莓派GPIO控制代码错误排查与解决

错误原因

rpi_board被定义为数组而非对象,你试图直接通过数组访问pin_19_out这类属性,数组本身不存在这些属性,导致rpi_board.pin_19_out返回undefined,后续调用writeSync时触发Cannot read property 'writeSync' of undefined错误。

问题细节

rpi_board当前是包含多个独立键值对对象的数组,每个元素是单独的{'pin_xx': ...}结构,数组没有pin_19_out这类属性,直接访问必然得到undefined,赋值给outputChannels的physicalPin后,调用方法自然报错。

修复方案

推荐方案:将rpi_board改为单个对象

把所有引脚实例作为同一个对象的属性,这样可以直接通过属性名访问,写法简洁直观:

var gpio = require('onoff').Gpio;
// 改为单个对象,所有引脚作为对象的属性
var rpi_board = {
    'pin_17_in': new gpio(17,'in'),
    'pin_27_in': new gpio(27,'in'),
    'pin_19_out': new gpio(19,'out'),
    'pin_26_out': new gpio(26,'out')
};

var outputChannels = [
    { physicalPin: rpi_board.pin_19_out, pin:19, location:"EntraceLight", meter: "EntraceLightON", active:true, device_id:2 },
    { physicalPin: rpi_board.pin_26_out, pin:26, location:"BackdoorLight", meter: "BackdoorLightON", active:true, device_id:3 }
];
console.log("Set outputChannels[0] to high: ")
console.log(outputChannels[0].physicalPin.writeSync(1))

备选方案(不推荐):通过数组索引访问元素后取属性

如果一定要保留数组结构,需要先通过索引定位到数组中的对应对象,再访问属性,但这种写法冗余且易出错:

var gpio = require('onoff').Gpio;
var rpi_board = [{'pin_17_in':new gpio(17,'in')},
                 {'pin_27_in':new gpio(27,'in')},
                 {'pin_19_out':new gpio(19,'out')},
                 {'pin_26_out':new gpio(26,'out')}];

// 通过数组索引访问对应元素后取属性
var outputChannels = [
    { physicalPin: rpi_board[2].pin_19_out, pin:19, location:"EntraceLight", meter: "EntraceLightON", active:true, device_id:2 },
    { physicalPin: rpi_board[3].pin_26_out, pin:26, location:"BackdoorLight", meter: "BackdoorLightON", active:true, device_id:3 }
];
console.log("Set outputChannels[0] to high: ")
console.log(outputChannels[0].physicalPin.writeSync(1))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:01:12