Pyserial ne joue pas bien avec le port virtuel

Motivation

je veux commencer à leraning comment utiliser la bibliothèque python Pyserial . Il semble vraiment comme un belle bibliothèque qui fonctionne pour beaucoup de gens. Je veux l'utiliser pour un projet à venir dans lequel je dois automatiser les communications série.

environnement

je lance Ubuntu 15.04. J'utilise Python 2.7.

mise en place de ports virtuels

Je n'ai pas actuellement de périphérique avec lequel je peux communiquer via un port série. J'utilise l'application socat pour créer deux ports virtuels qui sont connectés entre eux avec un baudrate de 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

Super! On dirait que les ports fonctionnent!

a simple pyserial script

j'installe pyserial utilisation de pip

$ sudo pip install pyserial

puis j'ai écrit un peu serialtest.py

#!/usr/bin/env python
import serial

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

C'est-à-dire la totalité de serialtest.py

exécuter le script et rencontrer une erreur

$ 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

Qu'est-ce qui se passe avec ça?

tentatives infructueuses de débogage

ce type dit a eu du succès en utilisant python 2.6. Je n'ai pas pu faire travailler Pyserial avec 2.6.

ce type avait des problèmes avec is baudrate. J'ai vérifié mon baudrate avec la commande $stty -F /dev/pts/2 et j'ai confirmé qu'il était, en fait, à un baudrate de 9600.

Ce mec affirme aussi avoir des problèmes avec le débit en bauds et l'attribue à son noyau. C'était en 2012, donc je ne pense pas que ce soit pertinent.

Ma Question

Comment puis-je obtenir mon serialtest.py script à exécuter sans erreur?

8
demandé sur Community 2016-01-16 22:24:24

2 réponses

pour compléter cette Q&A, il s'agit d'une solution (comme trouvé dans le lien par Austin Philips):

#!/usr/bin/env python
import serial

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

de cette PySerial Github question pour plus d'explication.

13
répondu Sebastian 2016-04-13 14:16:22

selon la question mentionnée par Sebastian, cette question est résolue à partir de la version 3.1 de Pyserial.

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

zsquareplusc a commenté le 29 Mai

publié 3.1 où une erreur de définition de lignes de contrôle dans open() est ignoré (mais pas dans les appels ultérieure).

mise à jour via pip, github ou le page de téléchargement: https://pypi.python.org/pypi/pyserial

0
répondu Peter Gibson 2016-09-08 14:22:32