2017-07-19 101 views
0

我正在尝试设置一个扭曲的程序以模拟发送/接收AT命令的串行设备。不同的设备可以打开不同数量的串行端口,并将这些端口用于不同的事情。单个扭曲反应器内的多个串行端口

我希望我的应用程序能够根据需要打开尽可能多的串行端口,并知道串行设备正在写入dataReceived。我不想在不同的反应器或线程上运行每个端口。

有没有办法做到这一点?

class VirtualDeviceBase(LineReceiver): 
    def __init__(self, reactor, serial_address): 
    [...] 

    def open_port(self): 
     self.serial_device = SerialPort(self, serial_address, reactor) 
     self.serial_device2 = SerialPort(? , serial_address, reactor) 

    def dataReceived(self,data): 
     [...] 

我已经试过这样:

class VirtualDeviceBase(LineReceiver): 

    class Protocol(LineReceiver): 
     def __init__(self,reactor,address): 
      [...] 

    def open_port(self): 
     new_protocol = self.Protocol() 
     self.serial_device = SerialPort(self, serial_address, reactor) 
     self.serial_device2 = SerialPort(new_protocol , serial_address, reactor) 

,并没有抛出任何错误,但不是他们都不叫dataRecevied了。

回答

1

只是实例化两个SerialPort s。给他们任何你喜欢的协议。他们可以共享一个反应堆。单个反应器可以处理许多不同的事件源。

from twisted.internet.protocol import Protocol 
from twisted.internet.serial import SerialPort 
from twisted.internet.task import react 

class Echo(Protocol): 
    def dataReceived(self, data): 
     print("Received: {}".format(data)) 

def main(reactor): 
    SerialPort(Echo(), "com0", reactor) 
    SerialPort(Echo(), "com1", reactor) 

react(main, []) 
+0

嗨吉恩,这个实现的问题是代码不知道哪个SerialPort调用dataRecived。 – AdamR

+0

没有什么能阻止你告诉它。你想知道什么?港口的名字?如何使端口的名​​称成为'Echo .__ init__'的参数,然后保存该值。 –