Forum: Mikrocontroller und Digitale Elektronik USB Tastatur Scancode


von Ulf (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

bin gerade am Programmieren einer USB- Box , die als Tastatur erkannt 
wird und Meßwerte an den PC übertragen soll. Das Ganze funktioniert 
soweit(Microchip Framework mit Pic18fx550).
Nun bin ich auf der Suche nach einer Codetabelle für die USB- Tastatur. 
Alles, was ich finden konnte, differenziert nicht zwischen Groß- und 
Kleinschreibung, z.B. steht für a A HEX 04.
Sende ich 0x04 an die Schnittstelle, erscheint brav das 'a'. Was aber 
muß ich senden, damit die 2. Belegung(hier also 'A') angezeigt wird?

Für Hilfe dankt

ulf.

von abc (Gast)


Lesenswert?

Shift gedrückt - A gedrückt - A losgelassen - Shift losgelassen

von Ulf (Gast)


Lesenswert?

ÄÄÄh, es geht ums Senden der Codes, nicht, wie man die Tasten drückt.
Meiner Meinung nach kommt von der Tastatur immer nur 1 Zeichen.
Wenn ich 0xE1(=SHIFT Taste links) und danach 0x04 sende, erscheint immer 
noch'a'.

ulf.

von abc (Gast)


Lesenswert?

Ulf schrieb:
> ÄÄÄh, es geht ums Senden der Codes, nicht, wie man die Tasten drückt.
Witzbold... Ich meinte natürlich die entsprechenden Codes senden, 
zumindestens bei "normalen" Tastaturen funktioniert das so.

von ?!? (Gast)


Lesenswert?

Vieleicht Caps Lock?

von Ulf (Gast)


Lesenswert?

nochmal:
Wenn ich 0xE1(=SHIFT Taste links) und direkt danach 0x04 sende, 
erscheint immer noch'a'.


ulf.

immer noch ratlos

von Ulf (Gast)


Lesenswert?

Hallo ?!?

Tatsache- mit DEM Trick kann man sich drumrummogeln.

Caps Lock senden
0x04 senden(klein'a')
Caps Lock senden

ergibt 'A'.
Für meine Zwecke reicht's, die wenigen Großbuchstaben benötige ich nur 
in der Überschrift, dann kommen Zahlen...


Danke!
ulf.
später vllt. mit eleganterer Lösung.

von max (Gast)


Lesenswert?

Die Shift/Caps Taste beeinflusst nicht die Interpretation der nächsten 
Taste
Setze das Modification-Bit für Shift in genau der Nachricht in der du 
den Tastendruck für A sendest.

Erklärung (und ich glaub Beispiele auch) steht aber in der USB-HID 
Spezifikation.

von Ulf (Gast)


Lesenswert?

Dank @ max

habe die Erklärungen für die Modification-Bits gefunden, werden in Byte 
0 der Nachricht gesendet. Eine etwas gewöhnungsbedürftige 
Herangehensweise, macht relativ viel Mühe beim Senden eines Textstrings.

Ein Problem habe ich noch. Wenn ich in den Modification-Bits was 
geändert habe, spinnen hinterher Tastatur und Maus, egal, ob noch 
Datanpakete mit Modification-Bits 0(d.h.Byte0 der Nachricht=0) 
nachgeschickt wurden. Die "hängenden" Sondertasten sind erst nach 
Windows-Neustart wieder normal.

Momentan finde ich keine Lösung und bleibe erstmal beim Trick mit der 
CapsLock Taste, auch wenn mich's wurmt...

ulf.

von Ulf (Gast)


Lesenswert?

Hallo nochmal!

Fehler gefunden, der Modifier war Quatsch. Weiß der Deibel, wie ich auf 
0xE1 kam, muß natürlich 0x02 sein für linke Shifttaste.
Jetzt geht es wie folgt:

Keyboard(0x02,key_code); //Shift + Tastencode wie benötigt
Keyboard(0,0); //Modifier zurücksetzten, keine Taste gedrückt

void Keyboard(unsigned char mod,unsigned char key_code){
 if(HIDTxHandleBusy(lastINTransmission)) DelayMs(10);
 if(!HIDTxHandleBusy(lastINTransmission)){
  hid_report_in[0] = modifier;
  hid_report_in[1] = 0;
  hid_report_in[2] = key_code;
  hid_report_in[3] = 0;
  hid_report_in[4] = 0;
  hid_report_in[5] = 0;
  hid_report_in[6] = 0;
  hid_report_in[7] = 0;
  lastINTransmission = HIDTxPacket(HID_EP,BYTE*)hid_report_in, 0x08);
 }
 return;
}

ulf

von Guido Körber (Gast)


Lesenswert?

Der weit verbreitete Denkfehler ist, dass USB Scancodes verwenden würde 
wie PS/2. Tatsächlich schickt eine HID Tastatur aber eine 
Zustandsmeldung, also gibt in einem Report an welche Tasten gerade 
gedrückt sind.

Einige Windows-Versionen haben übrigens bunte Effekte bei den Modifiers, 
die reagieren teilweise erst beim nächsten Report auf eine Änderung des 
Status. Daher sollte man erst den Modifier als betätigt und dann die 
dazu gehörende Zeichentaste schicken.

von Markus Birkner (Gast)


Lesenswert?

Danke an Guido Körber:

Wir haben einen RFID-Reader entwickelt, der sich als USB-HID am Computer 
anmeldet. Mehrere ID-Nummern sollten durch Semikolon getrennt werden. 
Klappt auch prima, nur wenn die Daten über eine 
Windows-Remote-Verbindung übertragen wurden, kam bei manchen 
Windows-Versionen (XP, 2003 Server) statt des Semikolon nur ein Komma 
an.
Dank dem Tipp von Guido Körber senden wir nun auch zuerst das Drücken 
der Shift-Taste, dann das Zeichen mit Shift, dann den Code für Tasten 
losgelassen. So klappt es.

Ein tagelanges Suchen hat ein Ende,
Markus

von Guido Körber (Gast)


Lesenswert?

:)

Musste diese Sachen auf die harte Tour lernen bei der Entwicklung 
unserer KeyWarrior Controller. Zum Glück arbeiten wir hier 
cross-Platform und meine hauptsächliche Arbeitsplattform ist MacOS. 
Dadurch sieht man dann das unterschiedliche Verhalten auf den 
verschiedenen Betriebssystemen und stellt weniger die eigene geistige 
Gesundheit als die der Windows-Entwickler in Frage >)

von Wolfgang (Gast)


Lesenswert?

Hallo,

ich schicke vom Controller den Modifier und dann an Stelle [2] den Key. 
Das tut soweit alles, es kommt sauber Shift-Ctrl usw. an. Jetzt habe ich 
das Problem, dass bei dem Buchstaben Y und Z vertauscht ist. Ich habe 
schon am Feld bCountry rumgespielt, aber Windows interestiert das nicht. 
(ja, meine Haupttastatur ist deutsch). Hat hier auch einer der 
Spezialisten einen Rat?

Vielen Dank

Wolfgang

von Wolfgang K. (opendcc)


Lesenswert?

Hallo,

unter Windows wird die Keycode-Translation erst nach der HID-Device 
gemacht, d.h. alle Keyboards unterliegen der gleichen Mauschelei. Das 
kann bei Hotkeys z.B. für eine CNC-Steuerung böse rausgehen: statt in 
Y-Richtung fährt der Tisch in Z-Richtung.

Unter Linux kann man im Xserver die Translation an je jeweilige PID 
anhängen und so ein Controltastatur unabhängig vom normal 
angeschlossenen Keyboard machen.

cu Wo

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.