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

Python 如何使用twisted'定义i2c地址;串行端口/协议类,python,twisted,i2c,twisted.internet,Python,Twisted,I2c,Twisted.internet,我正在尝试使用twisted访问I2C设备。两个设备位于相同的I2C端口/dev/I2C-1,并且具有不同的地址(0x68,0x69)。我的问题是,我很难理解在我的代码逻辑中应该在哪里为我的设备指定I2C地址 我有一个现有的工作脚本,它使用twisted SerialPort、协议和工厂从不同的传感器获取输入。下面的代码缺少的是一种指示从哪个I2C地址读取传入数据的方法。我在GitHub上找到twisted的协议类,并尝试根据我的目的对其进行调整,但是该扩展中的i2c地址是根据接收到的数据进行访

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

我有一个现有的工作脚本,它使用twisted SerialPort、协议和工厂从不同的传感器获取输入。下面的代码缺少的是一种指示从哪个I2C地址读取传入数据的方法。我在GitHub上找到twisted的协议类,并尝试根据我的目的对其进行调整,但是该扩展中的i2c地址是根据接收到的数据进行访问的。如果我在同一个I2C端口上有两个设备,我就不希望这样做

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

从twisted.internet导入
从twisted.internet.serialport导入serialport
从twisted.internet.protocol导入协议
IMU_类协议(协议):
#类来记录IMU
def常数(自身、传感器、I2C_地址):
self.sensor=传感器
self.I2C\u ADDR=I2C\u ADDR
接收到def数据(自身、数据):
打印'dataReceivedIMU called',time.time()
#如何指定从哪个地址获取数据?
i2c_地址,值=数据
imu_数=(1,2)
i2c_地址=(0x68,0x69)
sen_log_instances={}#日志实例字典
对于imu编号,邮政编码中的imu地址(imu编号、i2c地址):
sen_log_实例['IMU_'+IMU_no]=IMU_协议()
sen_log_实例['IMU_'+IMU_no]。常量(IMU_no,IMU addr)
串行端口(sen_log_实例['IMU_'+IMU_no],'/dev/i2c-1',reactor,波特率='115200')
传感器编号+=('IMU'+IMU编号,)
事实=EchoClientFactory(传感器日志实例、传感器编号、字段名称)
反应堆运行()

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

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

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

  • 找到一个能够以文件描述符的方式操作I2C的Python库(不幸的是,smbus2不能)
  • 子类twisted.internet.abstract.FileDescriptor,并重新编写fileno()、doRead()、doWrite()等方法
  • 初始化时为每个I2C addr创建一个实例

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

    我不完全清楚您的要求。如果我对i2c有更多的经验,也许会更好。但是,如果你能为你的问题添加足够的信息,这样就不需要i2c专业知识,你会得到更多可能的答案。对我来说,看起来你确实在IMU协议中得到了一些数据,但我不知道这些数据是什么。我也不清楚您是否询问如何配置i2c设备,或者设备是否工作正常,您只需要帮助解释从他们那里收到的信息。感谢您的回复,并对模棱两可表示歉意-我本人仍在学习i2c和串行通信的过程中。基本上,我知道i2c设备可以工作,我可以使用为IMU编写的python库从中获取数据。我想做的是将传感器输出集成到现有脚本中,读取其他传感器的串行输出,但是根据这一点,我需要将i2c信号转换为虚拟(?)串行信号。我想问题是,我的i2c设备作为从设备,而我的系统作为主设备。我设法使用SMBus库设置了一个i2c协议,但是datareceived()没有被触发,因为设备正在等待读取信号,它不会主动发送数据。在这种情况下,我想我需要回到原点,并尝试找出如何解决这个问题。感谢您的回答,我认为这解决了我的问题,即上述扩展中的方法是否可行(不可行)。我将尝试找到一个将I2C作为文件描述符处理的库,或者尝试找出解决此问题的不同方法。