加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:18:49 所属栏目:Python 来源:网络整理
导读:我目前使用twisted来连接到我拥有的串行设备,使用如下代码. from twisted.internet import reactorSerialPort(Handler(),"/dev/ttyACM1",reactor,baudrate='9600')reactor.run() 但是,我知道需要扩展应用程序以监视添加(和删除)的新串行设备.我目前使用pyino
我目前使用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事件处理程序在一个单独的线程中启动,这意味着反应堆没有在主线程中运行.这是一个问题吗?

连接第一个设备后,我很难添加第二个设备 – 至少反应堆已经在第二个设备添加时运行.即使我用一个保护它

if not reactor.running:

第二个连接没有正确添加到反应器(至少connectionMade,dataReceived接收方法不会触发).

如果我首先启动反应器,然后让pyinotify事件尝试并添加到正在运行的反应器,这似乎也不起作用 – 设备连接,但dataReceived方法永远不会被调用.

基本上,我确信有一个简洁的方法让这个工作,我只是无法通过谷歌或反复试验找到它.任何人都可以向我建议我如何才能使这个工作?

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

西蒙

解决方法

任何时候你想使用Twisted API但你的代码没有在与反应器相同的线程中运行,你可以使用reactor.callFromThread让反应器在你的线程中调用你的一些代码.所以,例如,你可以这样做:

def process_IN_CREATE(self,event):
    reactor.callFromThread(
        SerialPort,Handler(),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(),# Or... use `path` here?
        reactor,baudrate='9600')

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

reactor.run()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读