Forum: PC-Programmierung Gamepad mit Python auslesen -> IOError


von Simon S. (-schumi-)


Lesenswert?

Hallo,

ich habe hier einen kleinen TL-MR3020-Router mit OpenWRT drauf, an dem 
über einen Hub ein Gamepad angeschlossen ist. Treiber funktioniert auch, 
denn mit etwas gewackel an den Buttons/Sticks ergibt sich:
1
root@OpenWrt:~# cat /dev/input/js0 | hexdump
2
0000000 007f c984 0000 8100 007f c984 0000 8101
3
0000010 007f c984 0000 8102 007f c984 0000 8103
4
0000020 007f c984 0000 8104 007f c984 0000 8105
5
0000030 007f c984 0000 8106 007f c984 0000 8107
6
0000040 007f c984 0000 8108 007f c984 0000 8109
7
0000050 007f c984 0000 810a 007f c984 0000 810b
8
0000060 007f c984 0000 8200 007f c984 0000 8201
9
0000070 007f c984 0000 8202 007f c984 0000 8203
10
0000080 007f c984 0000 8204 007f c984 0000 8205
11
0000090 007f c984 7fff 8206 007f d460 0001 0100
12
00000a0 007f d4c4 0000 0100 007f d6f4 0001 0100
13
00000b0 007f d730 0001 0101 007f d74e 0000 0100
14
^C
15
root@OpenWrt:~#

Ziel ist jetzt, das ganze mit Python auszuwerten und letztendlich einen 
Roboter steuern. Also erst mal das Auslesen testen:
1
root@OpenWrt:~/gamepad# cat gamepad.py 
2
#!/usr/bin/env python
3
import sys
4
5
gamepad = open('/dev/input/js0','r')
6
7
print(gamepad)
8
9
test = gamepad.read(1)
10
print(test)
11
12
gamepad.close()
13
root@OpenWrt:~/gamepad# ./gamepad.py 
14
<open file '/dev/input/js0', mode 'r' at 0x77408e38>
15
Traceback (most recent call last):
16
  File "./gamepad.py", line 8, in <module>
17
    test = gamepad.read(1)
18
IOError: [Errno 22] Invalid argument
19
root@OpenWrt:~/gamepad#

Weis damit jemand was anzufangen? Gemacht habens auch schon andere, z.B. 
http://upgrayd.blogspot.de/2011/03/logitech-dual-action-usb-gamepad.html

Würde mich über einen Tipp freuen ;-)

von Kaj (Gast)


Lesenswert?

Simon S. schrieb:
> Weis damit jemand was anzufangen?

Steht da doch:
Simon S. schrieb:
> Traceback (most recent call last):
>   File "./gamepad.py", line 8, in <module>
>     test = gamepad.read(1)
> IOError: [Errno 22] Invalid argument
Du hast die Funktion read() falsch aufgerufen, bzw. gibt es Probleme 
beim lesen.
Um welche Pythonversion handelt es sich?
Probier doch einfach mal read() ohne Argument, oder
1
f = open(file)
2
for line in f:
3
  print(line)

Schau auch hier mal rein: 
http://stackoverflow.com/questions/11662960/ioerror-errno-22-invalid-argument-when-reading-writing-large-bytestring
Kann sein das du das Device im Binarymode oeffnen musst, und nicht im 
normalen readmode.

Gruesse

von Simon S. (-schumi-)


Lesenswert?

Kaj schrieb:
> Du hast die Funktion read() falsch aufgerufen, bzw. gibt es Probleme
> beim lesen.
http://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects
> To read a file’s contents, call f.read(size), which reads some quantity
> of data and returns it as a string. [...] at most size bytes are read
> and returned. If the end of the file has been reached, f.read() will
> return an empty string ("").
Sollte passen? (BTW: Wenn ich anstatt /dev/input/js0 eine andere leere 
Datei nehme funktioniert es tadellos, es liegt also nicht an fehlendem 
Input)

> Um welche Pythonversion handelt es sich?
2.7.3

> Probier doch einfach mal read() ohne Argument
Genau der selbe Fehler..

>, oder
1
f = open(file)
2
for line in f:
3
  print(line)
Das wirft zwar keinen Fehler, hilft aber leider nicht, weil der Treiber 
kein \n sendet, somit ist die line nie zuende
(Es gibt auch keinen Fehler mit .read(0), aber 0 Zeichen lesen macht 
wenig Sinn :-P )

>
> Schau auch hier mal rein:
> 
http://stackoverflow.com/questions/11662960/ioerror-errno-22-invalid-argument-when-reading-writing-large-bytestring
> Kann sein das du das Device im Binarymode oeffnen musst, und nicht im
> normalen readmode.
'rb', 'r+b', 'r+' hilft auch nicht, genau der selbe Fehler


Danke für deine Hilfe ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.