#python #sockets #pyserial #uart #pexpect
#python #сокеты #pyserial #uart #pexpect
Вопрос:
Моя цель — иметь возможность использовать модуль python expect в последовательном интерфейсе uart.
Я пытаюсь подключить модуль python pySerial ( serial
) к pexpect
модулю. Тем не менее, я получаю доступ к последовательному порту удаленно через сокет с serial.serial_for_url()
функцией, использующей протокол сокета.
При этом происходит сбой, потому что select()
необходимо fileno()
определить в последовательном объекте. Я получаю следующую ошибку: io.UnsupportedOperation: fileno
Почему протокол сокета может использовать socket.fileno()
? Я попробовал это, и, похоже, он работает должным образом под Linux.
Есть ли какая-либо причина, по которой это не должно поддерживаться по умолчанию в serial.urlhandlers.protocol_socket.py
?
Редактировать:
Я запустил следующее:
>>> import serial
>>> import fdpexpect
>>> fd = serial.serial_for_url('socket://10.28.1.15:7002')
>>> px = fdpexpect.fdspawn(fd, logfile=open('test.log','w'))
Обратите внимание, что вам нужно оборудование с мостом uart-to-network. Я использую Digi32CM в этом конкретном тесте, но это не совсем актуально.
Когда я запускаю fdspawn()
функцию, я получаю следующую ошибку:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "python2.7/site-packages/pexpect/fdpexpect.py", line 45, in __init__
fd = fd.fileno()
io.UnsupportedOperation: fileno
Serial
Объект pySerial не определяет fileno()
функцию, даже если она основана на сокете и может использовать сокет fileno. Когда я попытался добавить его, операция, похоже, работает нормально:
def fileno(self):
return self._socket.fileno()
Мне интересно, не упускаю ли я чего-то?
Комментарии:
1. Вы должны показать некоторый код, предпочтительно небольшую автономную программу, которую можно вырезать и вставить в файл, и демонстрирует проблему при выполнении.
2. Кроме того,
fileno()
на последовательном объекте поддерживается только на платформах UNIX, согласно документации. На какой платформе вы работаете?3. Какая у вас версия pySerial?
4. Я использую pySerial версии 2.7 и pexpect версии 3.3
5. Это просто не реализовано. Вы уже выяснили, как это реализовать самостоятельно. Исходный код.
Ответ №1:
Для информации, fileno() был добавлен в pyserial несколько лет назад, теперь он работает нормально.