2015-05-12 21 views
7

Czy istnieje sposób łączenia się z portem szeregowym sieci RFC2217 za pomocą Twisted Python?Używaj portów szeregowych RFC2217 z Twisted Python?

Pyserial wydaje się wspierać go poprzez serial.serial_for_url("rfc2217://...")function. I wskazują, że skręcone używa pyserial do zarządzania połączeniami szeregowymi, jednak wydaje się, że twisted.internet.serialport.SerialPort oczekuje nazwy lub numeru portu, co sugeruje, że właśnie przekazuje to do konstruktora serial.Serial.

Mogę używać programu społecznościowego do tworzenia PTY z zewnątrz i przekazywać nazwę dev do skręconej, która działa dobrze, ale zastanawiałem się, czy mogę ominąć ten krok, korzystając bezpośrednio z pomocy pyserial.

socat PTY,link=/dev/myport TCP:192.168.1.222:9001 

Edit: The pyserial faq sugeruje tę modyfikację dla instancji obiektów seryjne:

try: 
    s = serial.serial_for_url(...) 
except AttributeError: 
    s = serial.Serial(...) 

Nie wiem, czy to pomaga, choć ...

+0

Nie mam odpowiedzi dla ciebie Obawiam się; i podejrzewam, że odpowiedź będzie * Nie; jeszcze nie*; i prawdopodobnie zechcesz zgłosić problem :) - Jednak masz mnie na myśli, że my również powinniśmy dodać taką funkcję do [circuits.io.Serial] (https://github.com/circuits/circuits/ blob/master/circuits/io/serial.py) –

+0

Dzięki James, tak, popatrzę na zgłoszenie problemu/prośby o funkcję, jeśli nie ma dobrej odpowiedzi. –

+0

WRT do edycji; Myślę, że chciałbyś zrobić "' if ": //" in ". tj .: testowanie identyfikatora URI lub czegoś podobnego. –

Odpowiedz

2

doszedłem do wniosku, że przy użyciu pyserial użytkownika Obsługa RFC2217 w Twisted Pythonie nie jest banalna. Realizacja pyserial jest z RFC2217, oprócz being currently experimental, wykorzystuje wątki zarządzać połączenia z gniazdem, które stwierdzają jako problem dla wybranych aplikacji opartych:

Obecna realizacja rozpoczyna wątek, który utrzymuje odczytu z (wewnętrznego) gniazda. Wątek jest zarządzany automatycznie przez obiekt portu rfc2217.Serial na open()/close(). Jednak może to być problem dla aplikacji użytkownika, które lubią używać select zamiast wątków.

Jest to dość proste do podklasy tiserialport.SerialPort i nadpisać metodę _serialFactory (który tworzy pyserial obiektu mają być stosowane do uzyskiwania dostępu do portu szeregowego)

class SerialPort(serialport.SerialPort): 
    def _serialFactory(self, dev, *args, **kwargs): 
     " pyserial recommends the following for supporting serial urls " 
     try: 
      return serial.serial_for_url(dev) 
     except AttributeError: 
      return serial.Serial(dev, *args, **kwargs) 

Jednak powstały obiekt brakuje deskryptor pliku, a więc metoda fileno() (używana wewnętrznie przez t.i._posixserialport) zgłasza wyjątek.

--- <exception caught here> --- 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/base.py", line 1204, in mainLoop 
    self.doIteration(t) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/selectreactor.py", line 105, in doSelect 
    [], timeout) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/_posixserialport.py", line 48, in fileno 
    return self._serial.fd 
exceptions.AttributeError: 'Serial' object has no attribute 'fd' 

Aktualne obejścia mają użyć socat w sposób opisany w pytaniu, czy na serwerze sieciowym szeregowego używam (Brainboxes ES-842) można skonfigurować w trybie „Raw TCP” zamiast " Telnet/RFC2217 "i po prostu użyj istniejącego protokołu przez połączenie TCP (o ile nie polegasz na sterowaniu przepływem lub innych liniach sterowania szeregowego i możesz użyć predefiniowanej stałej prędkości transmisji).

Powiązane problemy