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?
Vedi https://github.com/pyserial/pyserial/issues/59. –
@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! –