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