2016-01-16 33 views
7

motivazionepySerial non gioca bene con porta virtuale

voglio cominciare Lifelong come utilizzare la libreria Python Pyserial. Sembra una biblioteca davvero carina che funziona per molte persone. Voglio usarlo per un prossimo progetto in cui devo automatizzare le comunicazioni seriali.

Ambiente

Io corro Ubuntu 15.04. Sto usando Python 2.7.

Impostazione delle porte virtuali

io attualmente non disporre di un dispositivo che possa comunicare con più di una porta seriale. Sto utilizzando l'applicazione socat per creare due porte virtuali che sono collegati tra loro con una velocità di trasmissione di 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 

Grande! Sembra che le porte funzionino!

Un semplice script pySerial

installo pySerial utilizzando pip

$ sudo pip install pyserial 

Poi ho scritto un po 'di serialtest.py

#!/usr/bin/env python 
import serial 

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

Questo è l'insieme di serialtest.py

Esecuzione dello script e di un errore

$ 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 

Cosa c'è in questo?

tentativi falliti di debug

This guy detto che ha avuto successo quando si usa Python 2.6. Non riuscivo a far funzionare Pyserial con 2.6.

This guy ha avuto problemi con il baud rate. Faccio doppio controllare la mia velocità di trasmissione con il comando $stty -F /dev/pts/2 e ha confermato che si trattava, in realtà, ad una velocità di trasmissione di 9600.

This guy sostiene inoltre di avere problemi con velocità di trasmissione e gli attributi al suo kernel. Era il 2012, quindi non penso sia più rilevante.

La mia domanda

Come posso ottenere il mio script serialtest.py l'esecuzione senza errori?

+0

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

+0

@AustinPhillips sei un tipo eccezionale. Non so molto sulla comunicazione seriale e RS-232 e su readytosend/clear-end, quindi il problema che hai sollevato sul wiki di Pyserial non mi è stato concettualmente chiaro. Tuttavia, ho invertito ciecamente la logica sulle righe 310 e 312 di serialposix.py e ho provato di nuovo il mio script. Ha funzionato! Ora posso leggere e scrivere nelle mie porte virtuali usando Pyserial. Anche se sembra che tu non sia sicuro al 100% nella tua correzione, sono disposto a correre con esso. Grazie per il tuo tempo! –

risposta

10

per rendere questo Q & Un completo, questa è una soluzione (come si trova nel link da Austin Philips):

#!/usr/bin/env python 
import serial 

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

Vai a questa PySerial Github issue maggiori spiegazioni.

0

In base al problema menzionato da Sebastian, questo problema è stato risolto a partire dalla versione 3.1 di Pyserial.

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

zsquareplusc commentato il 29 maggio

rilasciato 3.1 dove viene ignorato un'impostazione linee di comando in apertura di errore() (ma non nelle chiamate successive).

Aggiornamento tramite pip, GitHub o alla pagina di download: https://pypi.python.org/pypi/pyserial