使用python twisted framework连接到多个串行套接字

使用python twisted framework连接到多个串行套接字,python,serial-port,twisted,Python,Serial Port,Twisted,我目前使用twisted连接到一个串行设备,使用如下代码 from twisted.internet import reactor SerialPort(Handler(), "/dev/ttyACM1", reactor, baudrate='9600') reactor.run() 但是,我知道需要扩展应用程序,以监视添加(和删除)的新串行设备。我目前使用pyinotify查找正在添加/删除的新设备,这似乎很有效 class EventHandler(pyinotify.ProcessEv

我目前使用twisted连接到一个串行设备,使用如下代码

from twisted.internet import reactor
SerialPort(Handler(), "/dev/ttyACM1", reactor, baudrate='9600')
reactor.run()
但是,我知道需要扩展应用程序,以监视添加(和删除)的新串行设备。我目前使用pyinotify查找正在添加/删除的新设备,这似乎很有效

class EventHandler(pyinotify.ProcessEvent):
    def process_IN_CREATE(self, event):
        ... connect to serial device
        ...
目前我似乎有几个问题。我认为最大的问题是我对Twisted的了解还不够,不知道什么是“正确”的方法

目前,pyinotify事件处理程序在一个单独的线程中启动,这意味着reactor没有在主线程中运行。这是一个问题吗

一旦第一个设备连接好,我就很难再添加第二个设备——尤其是在添加第二个设备时,反应堆已经在运行了。即使我用一个

if not reactor.running: 
第二个连接没有正确地添加到反应器(至少ConnectionMode、dataReceived和received方法没有激发)

如果我先启动reactor,然后让pyinotify事件尝试并添加到正在运行的reactor中,这似乎也不起作用-设备确实连接,但从未调用dataReceived方法

基本上,我确信有一个很好的方法可以让它发挥作用,我只是没能找到它,无论是通过谷歌还是试错法。有人能告诉我怎么才能让它工作吗

提前感谢您提供的任何帮助


Simon

任何时候,如果您想使用Twisted API,但您的代码与reactor不在同一线程中运行,您可以使用
reactor.callFromThread
让reactor调用其线程中的一些代码。例如,你可以这样做:

def process_IN_CREATE(self, event):
    reactor.callFromThread(
        SerialPort, Handler(), "/dev/ttyACM1", reactor, baudrate='9600')
然而,您也不需要任何额外的线程来完成您描述的任务。不要使用
pyinotify
,而是使用
twisted.internet.inotify

from twisted.python.filepath import FilePath
from twisted.internet.inotify import IN_CREATE, INotify
from twisted.internet import reactor

def created(ignored, path, mask):
    SerialPort(
        Handler(),
        "/dev/ttyACM1", # Or... use `path` here?
        reactor, baudrate='9600')

notifier = INotify()
notifier.watch(FilePath("/some/directory"), IN_CREATE, callbacks=[created])
notifier.startReading()

reactor.run()