3

所以我在一个月前开始了一个使用 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. 泵卡在无限循环中可能出了什么问题,我该如何解决

4

0 回答 0