Python I2C从机不会定期应答,除非调用新脚本
我已经将ATtiny1627编程为I2C从机,以响应Python I2C从机不会定期应答,除非调用新脚本,python,python-3.x,raspberry-pi,i2c,Python,Python 3.x,Raspberry Pi,I2c,我已经将ATtiny1627编程为I2C从机,以响应读取I2C块数据()功能。基本上,它接收指示返回哪个变量的命令,并用表示浮点的4个字节回答。Raspberry Pi 4是I2C主机,必须每500毫秒读取一次数据,但以下代码不起作用: main.py import time from smbus import SMBus from struct import unpack i2c = SMBus(1) for i in range(10): #address: 0x0A, command:
读取I2C块数据()功能。基本上,它接收指示返回哪个变量的命令,并用表示浮点的4个字节回答。Raspberry Pi 4是I2C主机,必须每500毫秒读取一次数据,但以下代码不起作用:
main.py
import time
from smbus import SMBus
from struct import unpack
i2c = SMBus(1)
for i in range(10):
#address: 0x0A, command: 0x54, get 4bytes
bytes = i2c.read_i2c_block_data(0x0A, 0x54, 4)
[result] = unpack('f', bytearray(bytes))
print(result)
time.sleep(.5)
运行main.py会导致:
>sudo python3 main.py
100
100
nan
nan
nan
nan
nan
nan
nan
nan
奇怪的是,如果代码如下所示,它就可以完美地工作:
test.py
from smbus import SMBus
from struct import unpack
i2c = SMBus(1)
bytes = i2c.read_i2c_block_data(0x0A, 0x54, 4)
[result] = unpack('f', bytearray(bytes))
print(result)
和main2.py
import os, time
for i in range(10):
os.system('sudo python3 test.py')
time.sleep(.5)
正在运行main2.py:
>sudo python3 main2.py
100
100
100
100
100
100
100
100
100
100
这不是最优的,因为我无法轻松地将数据从test.py
传输到main2.py
,以便对其进行处理。
我尝试过其他组合,但效果不理想:
- 在
test.py
中定义方法并将其导入到main2.py
中不起作用
- 使用多进程并为每个循环创建新进程是行不通的
- 将SMBus(1)作为i2c使用
:
会引发AtributeError:\uu\uu enter\uu
,因为类错过了此方法
我认为它与smbus import smbus的有关,因为它是调用sudo python3 test.py
时重新执行的唯一命令,但在将方法导入main2.py
时不会重新执行
我是否丢失了类似于read_i2c_block_data()
在x秒后不发送启动信号或类似的内容?我建议不要将字节作为变量名,因为它内置于python中
但从代码中看不出问题是什么。您不需要像第二个示例中那样每次都重新初始化i2c总线
您是否尝试过以高于500毫秒的速度读取,但只返回非空值?即:
import time
from smbus import SMBus
from struct import unpack
i2c = SMBus(1)
current_vals = 0
while current_vals <= 10:
raw = i2c.read_i2c_block_data(0x0A, 0x54, 4)
[result] = unpack('f', bytearray(raw))
if result != "nan":
current_vals += 1
print(result)
time.sleep(.1)
导入时间
从smbus导入smbus
从结构导入解包
i2c=SMBus(1)
当前值=0
虽然当前的VAL不确定这是否相关,但如果它与RPi的I2C芯片仍然是相同的错误,那么请尝试类似于范围(10)中的i的:
\n,SMBus(1)为I2C:
\n字节=I2C。读取I2C块数据(……)
感谢您对变量名称的建议。问题不在这里,缩短采样周期不起作用,它只是得到更多的值,但在大约1s后,它开始得到nan,即周期:500ms得到2个样本,周期:200ms得到4个样本。