我能够在树莓派和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]错误的文件描述符
答案 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)