首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >凹槽振动传感器与树莓猪的通信

凹槽振动传感器与树莓猪的通信
EN

Stack Overflow用户
提问于 2017-12-06 21:01:02
回答 1查看 300关注 0票数 0

codeI有一个groovepi连接树莓派上的grove pi振动传感器。我已经使用以下命令在我的raspberry pi上下载了groove软件:

代码语言:javascript
复制
$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"

在这之后,我重新启动了我的树莓派,然后当我进入文件夹时:

代码语言:javascript
复制
$cd/home/pi/Desktop/GrovePi/Software/Python
$sudo python grove_piezo_vibration_sensor.py

我收到以下错误:

代码语言:javascript
复制
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__'

我使用的代码是:

代码语言:javascript
复制
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"

你能告诉我我做错了什么吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-12-06 22:38:37

如果您查看grovepi代码,analogRead函数如下所示:

代码语言:javascript
复制
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看起来像这样:

代码语言:javascript
复制
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返回值。其次,像这样屏蔽异常没有什么特别的帮助,因为异常可能包含指向问题根源的信息。考虑将上面的代码替换为:

代码语言:javascript
复制
    for i in range(retries):
        try:
            return bus.read_i2c_block_data(address, 1)
        except IOError:
            if debug:
                raise

然后启用调试模式。应该是这样的:

代码语言:javascript
复制
import grovepi
grovepi.debug = 1

现在,运行您的代码,您应该会看到异常。查看它是否包含有关该错误的更多详细信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47674945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档