与树莓派和arduino进行I2C通信的问题

时间:2019-10-10 14:44:17

标签: python arduino raspberry-pi3 i2c

我能够在树莓派和arduino之间实现I2C通信,并且能够一次将传感器数据传输到主机。但是,我的问题是,如果第二次尝试启动I2C通信-“ OSError:[Errno 9]错误的文件描述符”错误。这是我的下面的代码-

import time
import smbus
import struct
#Slave Address from Arduinos
SLAVE_ADDRESS = 0x04

#Creating I2C Bus
I2C_Bus = smbus.SMBus(1)

weight = 0

def get_data():
    return I2C_Bus.read_i2c_block_data(SLAVE_ADDRESS,0,16)

def get_int(data, index):
    bytes = bytearray(data[4*index:(index+1)*4])
    return struct.unpack("<i",bytes)[0]

def send_data(value):
    I2C_Bus.write_byte(SLAVE_ADDRESS,value)
    time.sleep(1)

def start():
    while True:
        for x in range(1,2):
            send_data(1)
            x = x +1
        data = get_data()
        weight = get_int(data,0)
        if (weight == 25000):
            I2C_Bus.close()
            time.sleep(5)
            x = 1
            get_input()
        else:
            print("The transaction weight is: "+str(weight))
        time.sleep(1)

def get_input():
    var = input("Enter a number from 1-9: ") 
    print(var)
    while (var != "1"):
        print ("Please select only 1 for now")
        get_input()
    if (var == "1"):
        start()

while True:
    get_input()

我猜问题是一旦执行I2C_Bus.close(),我将无法再次打开I2C总线。 I2C关闭后如何重新启动?我还附上了尝试启动I2C发送时间时遇到的错误。请注意,我需要将多个arduino作为奴隶连接到树莓派,尽管当前代码是针对单个奴隶的。我需要根据用户选择来调用特定的arduino。在开始与其他arduino通信之前,我们需要关闭总线吗?如果我错了,请指导我。非常感谢您的时间和帮助。

  

回溯(最近通话最近):文件   get_input()中的“ /home/pi/Desktop/weightData_PiMaster_2.py”,第65行   在第57行的文件“ /home/pi/Desktop/weightData_PiMaster_2.py”中   get_input start()文件“ /home/pi/Desktop/weightData_PiMaster_2.py”,   开始get_input()文件中的第38行   get_input中的第57行中的“ /home/pi/Desktop/weightData_PiMaster_2.py”   start()文件“ /home/pi/Desktop/weightData_PiMaster_2.py”,第30行,在   开始send_data(1)文件“ /home/pi/Desktop/weightData_PiMaster_2.py”,   第24行,位于send_data I2C_Bus.write_byte(SLAVE_ADDRESS,value)OSError中:   [Errno 9]错误的文件描述符

1 个答案:

答案 0 :(得分:0)

第二次调用start()将调用send_data(),后者在I2C_Bus.write_byte(SLAVE_ADDRESS,value)的上次调用中已经关闭的I2C_Bus上调用start()在脚本执行后打开一次。

在尝试读取或写入之前,必须再次打开总线。

也许按照文档中的建议使用它:

from smbus2 import SMBus

with SMBus(1) as bus:
    b = bus.read_byte_data(80, 0)
    print(b)