[code] [1]我有一个用于连接树莓派上的树丛pi振动传感器的凹槽。我已经使用以下命令在我的树莓派上下载了凹槽软件:
$cd /home/pi/Desktop
$ sudo git clone https://github.com/DexterInd/GrovePi
$ cd /home/pi/Desktop/GrovePi/Script
$ sudo chmod +x install.sh
$ sudo ./install.sh
$ sudo pip install grovepi"
在此之后我重新启动了我的覆盆子pi,然后当我进入文件夹时:
$cd/home/pi/Desktop/GrovePi/Software/Python
$sudo python grove_piezo_vibration_sensor.py
我收到以下错误:
Trceback (most recent call last):
File "grove_piezo_vibration_sensor.py", line 49, in <module>
print(grovepi.analogRead(piezo))
File "/home/pi/Desktop/GrovePi/Software/Python/grovepi.py", line 227, in analogRead
return number[1] * 256 +number[2]
TypeError: 'int' object has no attribute '__getitem__'
我使用的代码是:
import time
import grovepi
# Connect the Grove Piezo Vibration Sensor to analog port A0
# OUT,NC,VCC,GND
piezo = 0
grovepi.pinMode(piezo,"INPUT")
while True:
try:
# When vibration is detected, the sensor outputs a logic high signal
print grovepi.analogRead(piezo)
time.sleep(.5)
except IOError:
print "Error"
你能告诉我我做错了什么吗?谢谢!
答案 0 :(得分:2)
如果查看grovepi代码,analogRead
函数如下所示:
def analogRead(pin):
write_i2c_block(address, aRead_cmd + [pin, unused, unused])
read_i2c_byte(address)
number = read_i2c_block(address)
return number[1] * 256 + number[2]
你在最后一行看到了一个异常,它期望从read_i2c_block
返回某种序列,但是得到一个整数。查看代码中的其他位置,我们看到read_i2c_block
看起来像这样:
def read_i2c_block(address):
for i in range(retries):
try:
return bus.read_i2c_block_data(address, 1)
except IOError:
if debug:
print ("IOError")
return -1
现在,看起来好像read_i2c_block_data
(来自smbus
模块)将始终返回一个列表。这意味着从上面的函数返回单个整数的唯一方法是遇到IOError
异常。这将被exception IOError
块屏蔽,然后该函数将返回-1
。
grovepi
模块中的此代码存在许多问题。首先,调用read_i2c_block
的任何内容(如analogRead
函数)都应该检查-1
返回值。其次,屏蔽这样的异常并不是特别有用,因为异常可能包含指向问题根源的信息。考虑用以下代码替换上面的代码:
for i in range(retries):
try:
return bus.read_i2c_block_data(address, 1)
except IOError:
if debug:
raise
然后启用调试模式。这应该是这样的:
import grovepi
grovepi.debug = 1
现在,运行您的代码,您应该看到异常。查看它是否包含有关错误的更多详细信息。