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解析 ...
随机推荐
- [转]swift 学习资源 大集合
今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...
- JVM报错提示
持久代被占满 异常:java.lang.OutOfMemoryError: PermGen space 说明: Perm空间被占满.无法为新的class分配存储空间而引发的异常.这个异常以前是没有的, ...
- curl 返回响应头
demo:/root# curl -i baidu.com HTTP/1.1 200 OK Date: Wed, 27 Jul 2016 08:50:03 GMT Content-Type: text ...
- 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 ...
- [置顶] WEBSOKET服务器搭建
简单介绍一下tomcat的webSocketAPI使用: 在这里啰嗦几句:[ 很多朋友听说webSocket不知道是什么.知道是什么不知道怎么用,知道怎么用不知道具体实现.其实我当初也是这样. 实际上 ...
- 84. 从视图索引说Notes数据库(下)
作用和代价上文介绍了关系型数据库里的索引.Notes数据库里的索引隐藏在视图概念里(本文的讨论仅仅针对Notes的视图索引,不包括全文索引.).开发者创建的视图仅仅是存放在数据库里的一条设计文档.数据 ...
- MessageDigest简单介绍
本文博客原文 參考文章:http://blog.sina.com.cn/s/blog_4f36423201000c1e.html 一.概述 java.security.MessageDigest类用于 ...
- Android API 中文(77)——AdapterView.OnItemSelectedListener
前言 本章内容是android.widget.AdapterView.OnItemSelectedListener,版本为Android 2.3 r1,翻译来自"cnmahj",欢 ...
- Ext JS学习第十四天 Ext基础之 Ext.DomHelper
此文用来记录学习笔记 •我们已经学过了Element这个类,无疑是非常强大的,里面提供了丰富的方法供我们使用,但是Ext为了更加的方便我们去操作DOM元素,特提供了DomHelper这个辅助的工具 ...
- Arrays类学习笔记
Arrays.asList(arr); 该方法可以把数组变成List集合. String[] arr = {"abc","cc"}; List<Strin ...