USB键盘数据解析
以前用过的一个嵌入式设备使用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键盘数据解析的更多相关文章
- VC++ 6.0 C8051F340 USB 通信 CAN 数据解析
// HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...
- USB包格式解析(转)
本文对应usb2.0协议的第八章Protocol Layer. 数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN.OUT.SETUP),事务最后构成传输(中断传输 ...
- 警惕USB键盘记录器
最近媒体报道了一种新型的能记录账号.密码输入的“USB键盘记录器”,引发网友关注,该设备看上去和普通U盘没什么区别,将其插入电脑USB接口,然后把键盘线和它连接,该设备就能够自动记录用户在电脑上输入的 ...
- 让USB键盘的LED灯听你的!(不干扰使用)
最近在研究一个课题,如何能利用键盘的led灯通道进行有效通信,那么首先要做的就是尝试能否在不影响键盘的情况下控制LED灯(num lock ,caps lock ,scroll lock)的使用. 首 ...
- 深入理解USB流量数据包的抓取与分析
0x01 问题提出 在一次演练中,我们通过wireshark抓取了一个如下的数据包,我们如何对其进行分析? 0x02 问题分析 流量包是如何捕获的? 首先我们从上面的数据包分析可以知道,这是个USB的 ...
- USB键盘驱动分析
简介 本文介绍USB驱动程序编写的流程,分析一个键盘的USB程序,基于linux-2.6.39 USB驱动概要 分层 主机层面的USB驱动的整体架构可以分成4层,自顶到下依次是 1.USB设备驱动:本 ...
- C#-正则,常用几种数据解析-端午快乐
在等待几个小时就是端午节了,这里预祝各位节日快乐. 这里分享的是几个在C#中常用的正则解析数据写法,其实就是Regex类,至于正则的匹配格式,请仔细阅读正则的api文档,此处不具体说明,谢谢. 开始吧 ...
- 通读AFN①--从创建manager到数据解析完毕
流程梳理 今天开始会写几篇关于AFN源码解读的一些Blog,首先要梳理一下AFN的整体结构(主要是讨论2.x版本的Session访问模块): 我们先看看我们最常用的一段代码: AFHTTPSessio ...
- android基础(五)网络数据解析方法
在网络上传输数据时最常用的方法有两种:XML和JSON,下面就对这两种类型的数据解析进行讲解. 一.XML数据解析 在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析 ...
随机推荐
- linux下挂载第二块硬盘
1.第一步:添加硬盘/新建分区(fdisk) a.查看当前系统所有硬盘及分区情况:fdisk -lb.在指定的硬盘(例:/dev/sda)上创建分区:fdisk /dev/sda , 根据提示进行下一 ...
- rhApp遇到的项目问题
1.如果有多人同时操作一个桌台的情况下,如何处理: 2.index页面点击清空的时候是否要把桌台一起清掉: 3.账单界面已结账的小单背景色是否需要和未结账的不同:
- 转:在控制台中调试AngularJS应用
在控制台中调试AngularJS应用 在创建AngularJS应用时,一个很棘手的问题是如何在Chrome,Firefox,以及IE的JavaScript控制台中访问深藏在应用中的数据和服务.本文将会 ...
- Storm几篇文章
http://tianhailong.com/ http://www.cnblogs.com/panfeng412/archive/2012/07/02/storm-common-patterns-o ...
- 关于Qt信号与槽机制的传递方向性研究(结论其实是错误的,但是可以看看分析过程)
最近由于项目的需求,一直在研究Qt.信号与槽机制是Qt的一大特色,该机制允许两者间传递参数,依次来实现对象间的通信.这个参数会分别存在于信号的参数列表和槽函数的参数列表中.需要注意的是,若将槽函数绑定 ...
- srm 534
250 Description 给你一个1*n的棋盘.两人轮流行动,每一个人能够把"o"向右移动到空格子.或者跨越连续两个"o"到空格子. 一个"o& ...
- 设计模式 - 适配器模式(adapter pattern) 具体解释
适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...
- Web打印组件jatoolsPrinter(转载)
应用web化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于web的应用,客户端的规则很简单,容易学习,容易维护,容易发布.但对程序员来说,因为浏览器的局限性,却要面对很多挑战.怎么样 ...
- JavaSript模块化 && AMD CMD 详解.....
模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理.模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式.可以想象一个巨大 ...
- 关于Stack Overflow上ASP.NET最大连接数限制提问的一个思考
原文地址:Why request queuing is high even when request executing is below its limit? We are using below ...