使用python twisted framework连接到多个串行套接字
我目前使用twisted连接到一个串行设备,使用如下代码使用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
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()