gpt4 book ai didi

python - 使用 python twisted 框架连接到多个串行套接字

转载 作者:太空宇宙 更新时间:2023-11-03 13:23:26 26 4
gpt4 key购买 nike

我目前使用 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 事件处理程序在一个单独的线程中启动,这意味着 react 堆不在主线程中运行。这是一个问题吗?

连接第一台设备后,我很难再添加第二台设备 - 尤其是在添加第二台设备时 react 堆已经在运行。即使我用

if not reactor.running: 

第二个连接没有正确添加到 react 堆(至少 connectionMade、dataReceived 接收方法没有触发)。

如果我先启动 react 器,然后让 pyinotify 事件尝试添加到正在运行的 react 器,这似乎也不起作用 - 设备确实连接,但永远不会调用 dataReceived 方法。

基本上,我确信有一个巧妙的方法可以让它发挥作用,只是我无法通过 Google 或反复试验找到它。任何人都可以向我建议我如何才能让它发挥作用吗?

在此先感谢您提供的任何帮助,

西蒙

最佳答案

任何时候你想使用 Twisted API 但你的代码不在与 react 器相同的线程中运行,你可以使用 reactor.callFromThread 让 react 器调用你的一些代码它的线程。因此,例如,您可以执行以下操作:

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()

关于python - 使用 python twisted 框架连接到多个串行套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6057485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com