SMBus write_i2c_block_data()命令

时间:2018-01-30 10:31:32

标签: python raspberry-pi3 i2c smbus

所以我在微控制器上开始了一个项目,该项目在一个月前使用I2C通信,除了python之外什么都不知道。

我必须使用使用ASCII字符串进行通信的蠕动泵。 所以我的设置目前包括Raspberry Pi,I2C总线,Arduino和蠕动泵。 Arduino仅用作电力供应。我认为一个好的起点就是尝试打开和关闭泵LED。 LED上的代码是" L,1"对于LED关闭是" L,0"。 (""表示其中的内容是绝对代码)。 [链接] https://www.atlas-scientific.com/_files/_datasheets/_peristaltic/EZO_PMP_Datasheet.pdf

通过在python中使用smbus.SMBus,我通过write_i2c_block_data通过命令发送数据。 smbus的文档给出了以下内容:write_i2c_block_data(int addr,char cmd,long vals [])但是我不明白' char cmd'的含义。我不能在那里放一个字符串命令,它只有在我放入一个整数时才有用。

以下是代码:

import smbus
import time

bus = smbus.SMBus(1)

slave_address = 0x67
led_on = 'L,1'
led_off = 'L,0'



def string_to_charlist(a_string):
    stringlist = list(a_string)
    return stringlist

def string_to_intlist(a_string):
    lst = string_to_charlist(a_string)
    intlist = []
    for i in range(len(lst)):
        an_int = string_to_charlist(lst[i])
        intlist.append(an_int)
    return intlist

ledon_intlist = string_to_intlist(led_on)
ledoff_intlist = string_to_intlist(led_off)

# this will result in ledon_intlist = [76,44,49]
# this will result in ledon_int =list [76,44,48]

command1_on = ledon_intlist.pop(0)
command1_off = ledoff_intlist.pop(0)

for i in range(1):
    time.sleep(0.5)
    bus.write_i2c_block_data(slave_address, command1_on, ledon_intlist)
    time.sleep(0.5)
    bus.write_i2c_block_data(slave_address, command1_on, ledon_intlist)

通过raspberry Pi命令提示运行此代码后,泵LED在给定的时间范围内开始闪烁。不幸的是,当我使用i2ctools命令i2cdetect -y 1搜索它时,它永远不会停止闪烁并且也显示出来我假设泵的芯片现在处于无限循环中。

我的问题是: 1.如何使用write_i2c_block_data()命令以及它需要什么参数。目前我认为第一个参数是从属地址,第二个是流的初始字节,第三个参数是要发送的流整数值的其余部分。 2.什么可能出错,泵被卡在无限循环中,我该如何解决?

0 个答案:

没有答案