Pyserial плохо работает с виртуальным портом

Мотивация

Я хочу начать обучение использованию библиотеки Python Pyserial. Кажется, это действительно хорошая библиотека, которая работает для многих. Я хочу использовать его для будущего проекта, в котором мне нужно автоматизировать последовательную связь.

Окружающая среда

Я использую Ubuntu 15.04. Я использую Python 2.7.

Настройка виртуальных портов

В настоящее время у меня нет устройства, с которым я мог бы общаться через последовательный порт. Я использую приложение socat для создания двух виртуальных портов, которые соединены друг с другом с помощью скорость 9600 бод.

$ socat -d -d pty,raw,echo=0,b9600 pty,raw,echo=0,b9600
2016/01/16 12:57:51 socat[18255] N PTY is /dev/pts/2
2016/01/16 12:57:51 socat[18255] N PTY is /dev/pts/4
2016/01/16 12:57:51 socat[18255] N starting data transfer loop with FDs [5,5] and [7,7]
$ echo "hello" > /dev/pts/2
$ cat /dev/pts/4
hello

Большой! Вроде порты работают!

Простой скрипт pyserial

Я устанавливаю pyserial с помощью pip

$ sudo pip install pyserial

Потом написал немного serialtest.py

#!/usr/bin/env python
import serial

ser = serial.Serial('/dev/pts/2', 9600)

Это все serialtest.py

Запуск сценария и обнаружение ошибки

$ python serialtest.py 
Traceback (most recent call last):
  File "serialtest.py", line 4, in <module>
    ser = serial.Serial('/dev/pts/2')
  File "/home/sbl/.local/lib/python2.7/site-packages/serial/serialutil.py", line 180, in __init__
    self.open()
  File "/home/sbl/.local/lib/python2.7/site-packages/serial/serialposix.py", line 311, in open
    self._update_dtr_state()
  File "/home/sbl/.local/lib/python2.7/site-packages/serial/serialposix.py", line 605, in _update_dtr_state
    fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_DTR_str)
IOError: [Errno 22] Invalid argument

Что с этим?

Неудачные попытки отладки

Этот парень сказал, что добился успеха при использовании python 2.6. Мне не удалось заставить Pyserial работать с 2.6.

У этого парня возникли проблемы с baudrate. Я дважды проверил свою скорость передачи с помощью команды $stty -F /dev/pts/2 и подтвердил, что на самом деле она была на скорости 9600 бод.

Этот парень также утверждает, что у него проблемы со скоростью передачи, и приписывает это своему ядру. Это было еще в 2012 году, поэтому я не думаю, что это актуально.

Мой вопрос

Как я могу заставить мой скрипт serialtest.py работать без ошибок?


person Spencer B Liberto    schedule 16.01.2016    source источник
comment
См. github.com/pyserial/pyserial/issues/59.   -  person Austin Phillips    schedule 17.01.2016
comment
@AustinPhillips, ты классный чувак. Я мало что знаю о последовательной связи и RS-232, а также о готовности к отправке / очистке от отправки, поэтому проблема, которую вы подняли на вики-странице Pyserial, не была концептуально ясна для меня. Однако я вслепую перевернул логику в строках 310 и 312 файла serialposix.py и снова попробовал свой сценарий. Это сработало! Теперь я могу читать и писать в свои виртуальные порты с помощью Pyserial. Несмотря на то, что кажется, что вы не на 100% уверены в своем решении, я готов работать с ним. Спасибо за ваше время!   -  person Spencer B Liberto    schedule 18.01.2016


Ответы (2)


Чтобы сделать этот вопрос и ответ полным, вот решение (как найдено по ссылке Остина Филипса):

#!/usr/bin/env python
import serial

ser = serial.Serial('/dev/pts/2', 9600, rtscts=True,dsrdtr=True)

См. Дополнительную информацию в проблеме PySerial Github.

person Sebastian    schedule 13.04.2016

Согласно проблеме, упомянутой Себастьяном, эта проблема решена в версии 3.1 Pyserial.

https://github.com/pyserial/pyserial/issues/59

zsquareplusc прокомментировал 29 мая

выпущен 3.1, в котором игнорируются строки управления ошибкой в ​​open () (но не в последующих вызовах).

Обновление через pip, github или страницу загрузки: https://pypi.python.org/pypi/pyserial

person Peter Gibson    schedule 08.09.2016