Проблема со связью I2C с Raspberry Pi и Arduino - PullRequest
0 голосов
/ 10 октября 2019

Я могу установить связь I2C между Raspberry Pi и Arduino и передать данные датчика на мастер один раз. Тем не менее, моя проблема заключается в том, если попытаться инициировать соединение I2C во второй раз, когда я получаю - ошибка «OSError: [Errno 9] Bad file descriptor». Вот мой код ниже -

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. Обратите внимание, что мне нужно подключить несколько arduinos в качестве подчиненных к Raspberry, хотя текущий код предназначен для одного подчиненного. И мне нужно вызвать конкретный Arduino на основе выбора пользователя. Нужно ли нам закрывать автобус, прежде чем мы сможем начать общение с другим Arduino. Пожалуйста, ведите меня, если я ошибаюсь. Большое спасибо за ваше время и помощь.

Traceback (последний вызов был последним): файл "/home/pi/Desktop/weightData_PiMaster_2.py", строка 65, в файле get_input () "/home / pi / Desktop / weightData_PiMaster_2.py ", строка 57, в файле get_input start () (") /home/pi/Desktop/weightData_PiMaster_2.py ", строка 38, в стартовом файле get_input ()" / home / pi / Desktop /weightData_PiMaster_2.py ", строка 57, в файле start_input 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, значение) OSError: [Errno 9] Неверный дескриптор файла

1 Ответ

0 голосов
/ 10 октября 2019

Вызов 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)
...