codeI有一个groovepi连接树莓派上的grove pi振动传感器。我已经使用以下命令在我的raspberry pi上下载了groove软件:
$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"在这之后,我重新启动了我的树莓派,然后当我进入文件夹时:
$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"你能告诉我我做错了什么吗?谢谢!
发布于 2017-12-06 22:38:37
如果您查看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现在,运行您的代码,您应该会看到异常。查看它是否包含有关该错误的更多详细信息。
https://stackoverflow.com/questions/47674945
复制相似问题