smbus2是纯python中smbus cffi/smbus python的替代品
smbus2的Python项目详细描述
简介
smbus2是python-smbus包的纯python实现。
它是从头开始设计的,有两个目标:
- 它应该是SMBus的替代品。语法应相同。
- 与其他纯Python实现(如pysmbus)相比,在更大程度上使用固有的i2c结构和联合通过这样做,它将更完整,更容易扩展
当前支持的功能有:
- 获取I2C功能(I2C功能)
- 读取字节
- 写入字节
- 读取字节数据
- 写入字节数据
- 读取单词数据
- 写入单词数据
- 读取块数据
- 写入块数据
- 快速写作
- I2c_rdwr-具有重复启动的组合写入/读取事务
它是在Python2.7上开发的,但在Python3.x中也没有任何修改。
smbus代码示例
smbus2作为包安装在smbus旁边,因此它并不是100%的替代品。必须更改模块名称
示例1a:读取字节
fromsmbus2importSMBus# Open i2c bus 1 and read one byte from address 80, offset 0bus=SMBus(1)b=bus.read_byte_data(80,0)print(b)bus.close()
示例1b:使用“with”
读取字节这是同一个例子,但使用起来更安全,因为SMBus在退出带块时会自动关闭。
fromsmbus2importSMBusWrapperwithSMBusWrapper(1)asbus:b=bus.read_byte_data(80,0)print(b)
示例2:读取数据块
一次最多可以读取32个字节。
fromsmbus2importSMBusWrapperwithSMBusWrapper(1)asbus:# Read a block of 16 bytes from address 80, offset 0block=bus.read_i2c_block_data(80,0,16)# Returned value is a list of 16 bytesprint(block)
例3:写入一个字节
fromsmbus2importSMBusWrapperwithSMBusWrapper(1)asbus:# Write a byte to address 80, offset 0data=45bus.write_byte_data(80,0,data)
例4:写一个数据块
当时可以写入32个字节,但我发现这很容易出错。写得少一点,如果你遇到麻烦的话,在两者之间加上一个延迟。
fromsmbus2importSMBusWrapperwithSMBusWrapper(1)asbus:# Write a block of 8 bytes to address 80 from offset 0data=[1,2,3,4,5,6,7,8]bus.write_i2c_block_data(80,0,data)
I2C
从v0.2开始,smbus2库还支持组合读写事务。i2c\u rdwr并不是一个真正的smbus功能,但是在主服务器需要时可以使用:
- 读取或写入大于smbus的32字节限制的大量数据。
- 写一些数据,然后从从机上读取,中间有一个重复的开始位和无停止位。
每个操作都由一个i2c_msg消息对象表示。
示例5:单个I2C rDWR
fromsmbus2importSMBus,ic_msgwithSMBusWrapper(1)asbus:# Read 64 bytes from address 80msg=i2c_msg.read(80,64)bus.i2c_rdwr(msg)# Write some bytes to address 80msg=i2c_msg.write(80,[65,66,67,68])bus.i2c_rdwr(msg)
例6:双I2C rDWR
要执行双重操作,只需在总线调用中添加更多i2c_msg实例:
fromsmbus2importSMBus,ic_msg# Single transaction writing two bytes then read two at address 80write=i2c_msg.write(80,[40,50])read=i2c_msg.read(80,2)withSMBusWrapper(1)asbus:bus.i2c_rdwr(write,read)
例7:访问I2C消息数据
所有数据都包含在i2c_msg实例中。以下是一些数据访问替代方案。
# 1: Convert message content to listmsg=i2c.write(60,[1,2,3,4,5,6,7,8,9,10])data=list(msg)# data = [1, 2, 3, ...]print(len(data))# => 10# 2: i2c_msg is iterableforvalueinmsg:print(value)# 3: Through i2c_msg propertiesforkinrange(msg.len):print(msg.buf[k])
安装说明
smbus2是纯python代码,不需要编译。安装简单:
python setup.py install
或者只使用pip
pip install smbus2