以前用过的一个嵌入式设备使用USB键盘作为输入。当时还研究了一下USB协议,现在都快忘得差不多了。这里整理一下当时找到的关于USB键盘数据方面的资料。

主机与USB键盘建立连接后,定时从键盘获取8字节的输入报表。数据含义如下:

Byte Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0 RightGUI RightAlt RightShift RightControl LeftGUI LeftAlt LeftShift LeftControl
1 Reserved              
2 Keyboard Page Usage              
3 Keyboard Page Usage              
4 Keyboard Page Usage              
5 Keyboard Page Usage              
6 Keyboard Page Usage              
7 Keyboard Page Usage              

Byte1是保留字节,Byte0各位则表示左右GUI(win),alt,shift,control键是否按下,按下为1

剩下6个字节表示此时按下的其他所有键盘按键的键码,从低到高填充,没按就是0x00.如果同时按下的键超过允许,则显示0xff

键码含义可参照《HID Usage Tables》Version 1.11第53页中的Keyboard/Keypad Page。

我把常见的列写出来

#define        KB_ERROR            0x01
#define        KB_A                0x04
#define        KB_B                0x05
#define        KB_C                0x06
#define        KB_D                0x07
#define        KB_E                0x08
#define        KB_F                0x09
#define        KB_G                0x0A
#define        KB_H                0x0B
#define        KB_I                0x0C
#define        KB_J                0x0D
#define        KB_K                0x0E
#define        KB_L                0x0F
#define        KB_M                0x10
#define        KB_N                0x11
#define        KB_O                0x12
#define        KB_P                0x13
#define        KB_Q                0x14
#define        KB_R                0x15
#define        KB_S                0x16
#define        KB_T                0x17
#define        KB_U                0x18
#define        KB_V                0x19
#define        KB_W                0x1A
#define        KB_X                0x1B
#define        KB_Y                0x1C
#define        KB_Z                0x1D
#define        KB_1                0x1E
#define        KB_2                0x1F
#define        KB_3                0x20
#define        KB_4                0x21
#define        KB_5                0x22
#define        KB_6                0x23
#define        KB_7                0x24
#define        KB_8                0x25
#define        KB_9                0x26
#define        KB_0                0x27
#define        KB_ENTER            0x28
#define        KB_ESC                0x29
#define        KB_BACKSPACE        0x2A
#define        KB_TAB                0x2B
#define        KB_SPACE            0x2C
#define        KB_MIUS                0x2D    //-_
#define        KB_EQUAL            0x2E    //=+
#define        KB_LSQUBRACKET        0x2F    //[{
#define        KB_RSQUBRACKET        0x30    //]}
#define        KB_BACKSLASH        0x31    //\|

#define        KB_SEMICOLON        0x33    //;:
#define        KB_APOSTROPHE        0x34    //'"
#define        KB_TILDE            0x35    //`~
#define        KB_COMMA            0x36    //,<
#define        KB_FULLSTOP            0x37    //.>
#define        KB_SLASH            0x38    ///?
#define        KB_CAPSLOCK            0x39   
#define        KB_F1                0x3A
#define        KB_F2                0x3B
#define        KB_F3                0x3C
#define        KB_F4                0x3D
#define        KB_F5                0x3E
#define        KB_F6                0x3F
#define        KB_F7                0x40
#define        KB_F8                0x41
#define        KB_F9                0x42
#define        KB_F10                0x43
#define        KB_F11                0x44
#define        KB_F12                0x45
#define        KB_PRTSCR            0x46
#define        KB_SCOLLLOCK        0x47
#define        KB_PAUSE            0x48
#define        KB_INSERT            0x49
#define        KB_HOME                0x4A
#define        KB_PAGEUP            0x4B
#define        KB_DELETE            0x4C
#define        KB_END                0x4D
#define        KB_PAGEDOWN            0x4E
#define        KB_RARROW            0x4F
#define        KB_LARROW            0x50
#define        KB_DARROW            0x51
#define        KB_UARROW            0x52
#define        KB_NUMLOCK            0x53
#define        KB_PAD_DIV            0x54    ///
#define        KB_PAD_MUL            0x55    //*
#define        KB_PAD_MINUS        0x56    //-
#define        KB_PAD_PLUS            0x57    //+
#define        KB_PAD_ENTER        0x58
#define        KB_PAD_1            0x59
#define        KB_PAD_2            0x5A
#define        KB_PAD_3            0x5B
#define        KB_PAD_4            0x5C
#define        KB_PAD_5            0x5D
#define        KB_PAD_6            0x5E
#define        KB_PAD_7            0x5F
#define        KB_PAD_8            0x60
#define        KB_PAD_9            0x61
#define        KB_PAD_0            0x62
#define        KB_PAD_DEL            0x63

#define        KB_APPLICATION        0x65    //RWin右边键

参考资料:

1.基于USBL65C02的多媒体通用USB键盘开发 http://wenku.baidu.com/view/5929b19284868762caaed56e.html

2.Enhanced Keyboards and Windows  http://msdn.microsoft.com/en-us/windows/hardware/gg463446

3.HID Usage Tables .Version 1.11

4.键盘多媒体键的一些研究心得  http://www.mympc.org/news/2/2010-3-12_15191538479.html

USB键盘数据解析的更多相关文章

  1. VC++ 6.0 C8051F340 USB 通信 CAN 数据解析

    // HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...

  2. USB包格式解析(转)

    本文对应usb2.0协议的第八章Protocol Layer. 数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN.OUT.SETUP),事务最后构成传输(中断传输 ...

  3. 警惕USB键盘记录器

    最近媒体报道了一种新型的能记录账号.密码输入的“USB键盘记录器”,引发网友关注,该设备看上去和普通U盘没什么区别,将其插入电脑USB接口,然后把键盘线和它连接,该设备就能够自动记录用户在电脑上输入的 ...

  4. 让USB键盘的LED灯听你的!(不干扰使用)

    最近在研究一个课题,如何能利用键盘的led灯通道进行有效通信,那么首先要做的就是尝试能否在不影响键盘的情况下控制LED灯(num lock ,caps lock ,scroll lock)的使用. 首 ...

  5. 深入理解USB流量数据包的抓取与分析

    0x01 问题提出 在一次演练中,我们通过wireshark抓取了一个如下的数据包,我们如何对其进行分析? 0x02 问题分析 流量包是如何捕获的? 首先我们从上面的数据包分析可以知道,这是个USB的 ...

  6. USB键盘驱动分析

    简介 本文介绍USB驱动程序编写的流程,分析一个键盘的USB程序,基于linux-2.6.39 USB驱动概要 分层 主机层面的USB驱动的整体架构可以分成4层,自顶到下依次是 1.USB设备驱动:本 ...

  7. C#-正则,常用几种数据解析-端午快乐

    在等待几个小时就是端午节了,这里预祝各位节日快乐. 这里分享的是几个在C#中常用的正则解析数据写法,其实就是Regex类,至于正则的匹配格式,请仔细阅读正则的api文档,此处不具体说明,谢谢. 开始吧 ...

  8. 通读AFN①--从创建manager到数据解析完毕

    流程梳理 今天开始会写几篇关于AFN源码解读的一些Blog,首先要梳理一下AFN的整体结构(主要是讨论2.x版本的Session访问模块): 我们先看看我们最常用的一段代码: AFHTTPSessio ...

  9. android基础(五)网络数据解析方法

    在网络上传输数据时最常用的方法有两种:XML和JSON,下面就对这两种类型的数据解析进行讲解. 一.XML数据解析 在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析 ...

随机推荐

  1. [转]swift 学习资源 大集合

    今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...

  2. JVM报错提示

    持久代被占满 异常:java.lang.OutOfMemoryError: PermGen space 说明: Perm空间被占满.无法为新的class分配存储空间而引发的异常.这个异常以前是没有的, ...

  3. curl 返回响应头

    demo:/root# curl -i baidu.com HTTP/1.1 200 OK Date: Wed, 27 Jul 2016 08:50:03 GMT Content-Type: text ...

  4. android搭建环境错误 daemon not running. starting it now on port 5037 ADB server didn't ACK

    android搭建环境错误 daemon not running. starting it now on port 5037 ADB server didn't ACK ADB server didn ...

  5. [置顶] WEBSOKET服务器搭建

    简单介绍一下tomcat的webSocketAPI使用: 在这里啰嗦几句:[ 很多朋友听说webSocket不知道是什么.知道是什么不知道怎么用,知道怎么用不知道具体实现.其实我当初也是这样. 实际上 ...

  6. 84. 从视图索引说Notes数据库(下)

    作用和代价上文介绍了关系型数据库里的索引.Notes数据库里的索引隐藏在视图概念里(本文的讨论仅仅针对Notes的视图索引,不包括全文索引.).开发者创建的视图仅仅是存放在数据库里的一条设计文档.数据 ...

  7. MessageDigest简单介绍

    本文博客原文 參考文章:http://blog.sina.com.cn/s/blog_4f36423201000c1e.html 一.概述 java.security.MessageDigest类用于 ...

  8. Android API 中文(77)——AdapterView.OnItemSelectedListener

    前言 本章内容是android.widget.AdapterView.OnItemSelectedListener,版本为Android 2.3 r1,翻译来自"cnmahj",欢 ...

  9. Ext JS学习第十四天 Ext基础之 Ext.DomHelper

    此文用来记录学习笔记   •我们已经学过了Element这个类,无疑是非常强大的,里面提供了丰富的方法供我们使用,但是Ext为了更加的方便我们去操作DOM元素,特提供了DomHelper这个辅助的工具 ...

  10. Arrays类学习笔记

    Arrays.asList(arr); 该方法可以把数组变成List集合. String[] arr = {"abc","cc"}; List<Strin ...