如何使用twisted的串行端口/协议类定义i2c地址

2024-06-13 20:35:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用twisted访问I2C设备。两个设备都位于同一I2C端口/dev/i2c-1,并且具有不同的地址(0x68、0x69)。我的问题是我很难理解在我的代码逻辑中我应该在哪里为我的设备指定I2C地址。你知道吗

我有一个现有的工作脚本,它使用twisted串口、协议和工厂从不同的传感器获取输入。下面的代码缺少的是一种指示从哪个I2C地址读取传入数据的方法。我在GitHub上找到了twisted的协议类a I2cProtocol extension,并尝试根据自己的目的对其进行修改,但是该扩展中的i2c地址是根据接收到的数据访问的。如果我在同一个I2C端口上有两个设备,我就不会指望它能工作。你知道吗

为了简单起见,这是我的脚本的简化版本,显示了与I2C设备有关的部分:

from twisted.internet import reactor
from twisted.internet.serialport import SerialPort
from twisted.internet.protocol import Protocol

class IMU_Protocol(Protocol):
#Class to log IMU 
    def constants(self, sensor, I2C_ADDR):
        self.sensor    = sensor
        self.I2C_ADDR  = I2C_ADDR

    def dataReceived(self, data):
        print 'dataReceivedIMU called', time.time()
        #how do I specify which address to take the data from?
        i2c_address, value = data 

imu_numbers    = (1,2)
i2c_addresses  = (0x68,0x69)

sen_log_instances = {} #dictionary of logging instances

for imu_no,imu_addr in zip(imu_numbers,i2c_addresses):
    sen_log_instances['IMU_'+imu_no]= IMU_Protocol()
    sen_log_instances['IMU_'+imu_no].constants(imu_no,imu_addr)
    SerialPort(sen_log_instances['IMU_'+imu_no],'/dev/i2c-1', reactor, baudrate='115200')
    sensor_numbers += ('IMU_'+imu_no,)

fact = EchoClientFactory(sen_log_instances,sensor_numbers, field_name)
reactor.run()

Tags: instancesnofromselflog地址twistedi2c
1条回答
网友
1楼 · 发布于 2024-06-13 20:35:25

我认为,通过模拟SerialPort或其他现成的twisted模块中的机制,在twisted上下文中实现I2C支持并不容易。你知道吗

触发接收到的数据的关键步骤是使反应器意识到I2C设备在那里需要监视,只要一些数据准备就绪,它就应该从那里读取数据并传送到协议。你知道吗

作为高级应用程序的一部分,reactor对诸如serial或I2C之类的低级内容一无所知,但它对如何操作文件描述符非常了解,这是SerialPort的工作方式。所以,如果你真的想让I2C在twisted中运行,你必须做类似的事情。你知道吗

  1. 找到一个Python库,它可以以文件描述符的方式操作I2C(不幸的是smbus2不能)
  2. 子类扭曲的.internet.abstract.FileDescriptor,并重写fileno()、doRead()、doWrite()等方法
  3. 初始化时为每个I2C地址创建一个实例

上面提到的I2C协议扩展代码对您帮助不大,因为它基于Twisted的一个非常旧的版本,其中仍然使用SerialPortEndpoint。Twisted的最新版本支持有限类型的端点,因此您必须提供自己的端点。你知道吗

相关问题 更多 >