2016-01-16 14 views
7

Motywacyjnegopyserial nie gra dobrze z portem wirtualnym

Chcę zacząć leraning jak korzystać z biblioteki Pythona Pyserial. Wygląda to na naprawdę fajną bibliotekę, która działa dla wielu ludzi. Chcę go użyć do nadchodzącego projektu, w którym muszę zautomatyzować komunikację szeregową.

Środowisko

Używam Ubuntu 15.04. Używam Pythona 2.7.

Konfigurowanie portów wirtualnych

nie mam obecnie urządzenia, które mogę się porozumiewać przez port szeregowy. Używam aplikacji socat utworzyć dwa wirtualne porty, które są połączone ze sobą za pomocą szybkość transmisji od 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 

Wielkiej! Wygląda na to, że porty działają!

Prosty skrypt pyserial

zainstalować pyserial użyciu pip

$ sudo pip install pyserial 

Wtedy pisałem trochę serialtest.py

#!/usr/bin/env python 
import serial 

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

czyli całość serialtest.py

Uruchamianie skryptu i napotyka błąd

$ 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 

Co z tego?

Nieudane próby debugowania

This guy powiedział, że sukces podczas korzystania z Pythona 2.6. Nie mogłem zmusić Pyserial do pracy z 2.6.

This guy miał kłopoty z jest szybkość transmisji. I dokładnie sprawdzić moje baudrate z poleceniem $stty -F /dev/pts/2 i potwierdził, że to było w rzeczywistości, na szybkość transmisji od 9600.

This guy również twierdzi, że ma problemy z szybkość transmisji i przypisuje go do jądra. To było w 2012 roku, więc nie sądzę, by było to już istotne.

Moje pytanie

Jak mogę dostać mój skrypt serialtest.py uruchomić bez błędu?

+0

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

+0

@AustinPhillips jesteś jednym fajnym gościem. Nie wiem zbyt wiele na temat komunikacji szeregowej i RS-232 oraz readytosend/cleartosend, więc kwestia, którą poruszyliście na stronie Pyserial, nie była dla mnie jasna. Jednak na ślepo odwróciłem logikę na liniach 310 i 312 pliku serialposix.py i ponownie wypróbowałem mój skrypt. Zadziałało! Mogę teraz czytać i zapisywać do moich wirtualnych portów za pomocą Pyserial. Nawet jeśli wygląda na to, że nie jesteś w 100% pewny swojej poprawki, jestem gotów z tym skończyć. Dziękuję za Twój czas! –

Odpowiedz

10

Aby to Q & Kompletny, jest to rozwiązanie (jak stwierdzono w linku Austin Philips):

#!/usr/bin/env python 
import serial 

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

Zobacz ten PySerial Github issue więcej wyjaśnień.

Powiązane problemy