Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python I2C从机不会定期应答,除非调用新脚本_Python_Python 3.x_Raspberry Pi_I2c - Fatal编程技术网

Python 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:

我已经将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: 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个样本。