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

мотивация

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

Среда

Я использую 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.

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

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

Мой вопрос

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

2 ответа

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

#!/usr/bin/env python
import serial

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

Посмотрите эту проблему PySerial Github для более подробного объяснения.

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

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

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

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

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

Другие вопросы по тегам