2015-05-12 4 views
7

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

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

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

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

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

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

Не уверен, если это поможет, хотя ...

+0

У меня нет ответа для вас. Я боюсь; и я подозреваю, что ответ будет * Нет; еще нет*; и вы, вероятно, захотите записать проблему :) - Однако у вас есть мнение, что мы также добавляем такую ​​функцию к [circuit.io.Serial] (https://github.com/circuits/circuits/ blob/master/circuit/io/serial.py) –

+0

Спасибо Джеймсу, да, я посмотрю, как подать запрос о проблеме/функции, если нет хорошего ответа. –

+0

WRT для вашего редактирования; Я думаю, вы захотите сделать '' if ': // "in''. i.e: проверка URI или что-то еще. –

ответ

2

Я пришел к выводу, что использование Pyserial-х Поддержка RFC2217 с Twisted Python нетривиальна. Реализация Pyserial по RFC2217, кроме being currently experimental, использует потоки для управления сокет-соединение, провозгласивших как проблема для некоторых приложений, основанных на:

Текущая реализация запускает поток, который держит чтение из (внутреннего) розеткой. Нить управляется автоматически с помощью объекта 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() (используемый внутренне на t.i._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-соединению (если вы не зависите от управления потоком или других последовательных линий управления и можете использовать предопределенную скорость передачи в бодах).

Смежные вопросы