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?
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.
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