我正在尝试使用扭曲的方式访问I2C设备。这两种设备都位于同一个I2C端口/dev/i2c-1上,并且具有不同的地址(0x68,0x69)。我的问题是,我很难理解在我的代码逻辑中应该在哪里为我的设备指定I2C地址。
我有一个现有的工作脚本,它使用扭曲的SerialPort、协议和工厂从不同的传感器接收输入。下面的代码所缺少的是指示从哪个I2C地址读取传入数据的方法。我在I2cProtocol扩展的GitHub上找到了扭曲的协议类,并尝试根据我的目的对它进行修改,但是该扩展中的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()发布于 2019-09-06 03:41:23
我不认为在扭曲的上下文中通过模拟I2C或其他开箱即用的扭曲模块的机制来实现SerialPort支持是不容易的。
触发dataReceived的关键步骤是让反应堆意识到需要监视的I2C设备,只要一些数据准备就绪,它就应该从那里读取数据并传送到协议中。
反应堆作为高层应用程序的一部分,对诸如串行或I2C之类的低级应用程序一无所知,但它对如何操作FileDescriptor (这是SerialPort的工作方式)知道得很多。因此,如果您确实希望您的I2C在扭曲中是可行的,那么您必须做类似的事情。
上面提到的I2C协议扩展代码对您没有太大帮助,因为它基于一个非常老的Twisted版本,其中仍然使用SerialPortEndpoint。Twisted的最新版本支持有限类型的端点,因此您必须自己开发。
https://stackoverflow.com/questions/57770909
复制相似问题