树莓派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
相关产品推荐
相关产品推荐

