Использовать последовательные порты RFC2217 с помощью Twisted Python?

Есть ли способ подключиться к сетевому последовательному порту RFC2217 с помощью Twisted Python?

Pyserial, похоже, поддерживает его с помощью функции serial.serial_for_url("rfc2217://...") . И они указывают, что twisted использует pyserial для управления последовательными соединениями, однако twisted.internet.serialport.SerialPort похоже, ожидает имя или номер порта, который предполагает, что он просто передает это в serial.Serial конструктор.

Я могу использовать socat для создания PTY извне и передать имя dev для скручивания, которое отлично работает, но мне было интересно, могу ли я обойти этот шаг, используя прямую поддержку pyserial.

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

Изменить : pyserial faq предлагает эту модификацию для создания экземпляров серийных объектов:

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

Не уверен, что это поможет, хотя …

One Solution collect form web for “Использовать последовательные порты RFC2217 с помощью Twisted Python?”

Я пришел к выводу, что использование поддержки Pycerial RFC2217 с Twisted Python нетривиально. Реализация Pycerial RFC2217, помимо экспериментального времени , использует потоки для управления соединением сокета, которое они считают проблемой для избранных приложений:

Текущая реализация запускает поток, который продолжает чтение из (внутреннего) сокета. Нить управляется автоматически с помощью объекта rfc2217.Serial port на open () / close (). Однако это может быть проблемой для пользовательских приложений, которым нравится использовать select вместо потоков.

Довольно просто подклассифицировать tiserialport.SerialPort и перезаписать метод _serialFactory (который создает объект pyserial, который будет использоваться для доступа к последовательному порту)

 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) 

Однако в результирующем объекте отсутствует файловый дескриптор, поэтому метод fileno() (используемый внутри ti_posixserialport ) генерирует исключение.

 --- <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' 

Нынешние обходные пути – либо использовать socat как описано в вопросе, либо для сетевого последовательного сервера, который я использую (Brainboxes ES-842), вы можете настроить его в режиме «Raw TCP» вместо режима «Telnet / RFC2217» и просто используйте существующий протокол по TCP-соединению (если вы не зависите от управления потоком или других последовательных линий управления и можете использовать предопределенную скорость передачи в бодах).

Python - лучший язык программирования в мире.