Thread unverständnis zu sprintf
(22 answers)
Opened by also at 2010-08-13 21:19
Benutzt du das "hidraw" interface ("/dev/hidrawX")?
So weit ich mich an hidraw und tastaturen erinnere, werden da die Tastaturcodes gesendet, die ja nichts mit echten Zeichen zu tun haben, der Kernel weist ja den Tastaturcodes Buchstaben usw. zu. Wenn ich mich richtig erinnere hat man 4Byte die ersten die ersten beiden sind für Shift,Strg,Alt,etc. das die nächsten beiden sind für das Tatsturzeichen. (wenn zwei gedrückt werden werden beide Bytes für je ein Code genutzt) Danach werden 4Bytes "0" gesendet um die Sequenz ab zu schließen. Ich glaube nicht das Term::ReadKey damit richtig klar kommt. Ich meine es ist ausgelegt mit tty und sty devices zu arbeiten, nicht mit Devices, die "Rohdaten" senden. Bei einem hidraw Device würde ich es so anfangen: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; # meine USB-Tastatur liegt auf "/dev/hidraw2" my $input=shift(@ARGV) || "/dev/hidraw2"; open(my $fh, '<', $input) or die("ERROR open $input ($!)\n"); binmode($fh); while(1) { my @keys=read_all($fh); print Dumper(\@keys) if(@keys); print localtime()."\n"; sleep(1); } close($fh); sub read_all { my $fh=shift; my @keys; eval{ local $SIG{ALRM}=sub{die}; while(1) { my $buffer; alarm(1); read($fh,$buffer,8); alarm(0); my @l=unpack('CxC*',$buffer); # Fehler gemeldet (zu viele Tasten auf einmal) next if($l[3]==1 && $l[4]==1 && $l[5]==1 && $l[6]==1); push(@keys, [@l[0,1,2]]); } }; return @keys; } Edit: Hast du eventuell vergessen perl mitzuteilen, das er die Daten aus dem Filehandle nicht als ASCII Interpretieren soll? Siehe binmode. Last edited: 2010-08-14 19:08:07 +0200 (CEST) |