首页 基于HID的人机接口设备的设计及应用本科生毕业设计

基于HID的人机接口设备的设计及应用本科生毕业设计

举报
开通vip

基于HID的人机接口设备的设计及应用本科生毕业设计北京理工大学珠海学院2010届本科生毕业设计 基于HID的人机接口设备的设计及应用 摘 要 通用串行总线(USB),是连接计算机系统与外部设备的一个串口总线标准,也是输入输出接口的技术规范,被广泛应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视(机顶盒)、游戏机等相关领域。 HID(Human Interface Device)类设备是USB设备类型中的一种,是直接与人交互的设备,如键盘、鼠标等。HID类设备并不一定是标准的外设类型,只要交换的数据格式存储在报文的结构中,并且设备固件支持报...

基于HID的人机接口设备的设计及应用本科生毕业设计
北京理工大学珠海学院2010届本科生毕业设计 基于HID的人机接口设备的设计及应用 摘 要 通用串行总线(USB),是连接计算机系统与外部设备的一个串口总线标准,也是输入输出接口的技术规范,被广泛应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视(机顶盒)、游戏机等相关领域。 HID(Human Interface Device)类设备是USB设备类型中的一种,是直接与人交互的设备,如键盘、鼠标等。HID类设备并不一定是标准的外设类型,只要交换的数据格式存储在报文的结构中,并且设备固件支持报文的格式,则任何工作在该限制之内的设备均可称为HID设备,如电压计、温度计、读卡器等。因此,人机接口设备有巨大的应用市场。 针对以上需求,本文致力于开发一个基于HID的人机接口设备,在上位机编写相应的应用软件,实现人机接口设备与主机的通信。 本文首先阐述了开发基于HID的人机接口设备在经济和技术上的意义,继而描述了系统架构,基于VC的上位机软件开发,以及设备端固件代码的编写。文中对USB接口通信协议做了简要的介绍,并介绍了基于VC的Windows下USB接口驱动软件开发。 最后,本文对在研究和开发人机接口设备工作中的不足之处和需要改进的地方进行了总结,同时也展望了低成本的人机接口设备的市场潜力和USB发展的美好前景。 关键词: HID类 人机接口设备USB通信协议 HID device based on HID class ABSTRACT Universal Serial Bus is a serial bus standard which connects the computer system and the peripheral equipments. It is the input output interface specification as well. It is widely used in communication products such as personal computers and mobile devices. It is extending to the related fields, such as Camera Equipment, Digital Television (STB), and Game Console. HID class which short for Human Interface Device, is one of the USB device class. As we know, the Typical HID device are mouse, keyboard etc. HID class device didn’t always be the standard USB device. If only the data format is contained by the report structure which is supported by the USB firmware. Then we can call all of those devices as HID device, such as Voltmeter, Thermometer, Card reader and so on. Therefore, the human interface device has a vast potential market. So as this, this project aims to develop a HID device based on HID class .To implement the communication between PC host and the device, I need to program the PC application program software etc. Firstly, this paper set forth the economic and technical importance of the HID device based on HID class. And then describe the system framework. Also, briefly describe the USB specification. This paper concludes the shortage during the developing. And also prospect the bright future for the low-cost HID device. Key words: HID class, HID, USB specification 目 录 I摘 要 IIABSTRACT 11 绪 论 11.1选 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 背景 11.2选题目标 21.3需求分析 21.3.1用户需求分析 21.3.2功能需求分析 21.4主要内容 31.5本章小结 42 USB接口技术介绍 42.1 USB接口技术 42.1.1 USB简介 42.1.2 USB 的总线拓扑结构 52.1.3 USB系统分层 62.1.4 USB的编码方式 72.1.5 USB的即插即用 72.2 USB接口HID设备类 72.2.1 HID设备类简介 82.2.2 HID数据传输方式 82.2.3 HID设备枚举过程 92.2.4 HID设备类描述符 102.3本章小结 113 人机接口设备系统设计 113.1系统框架 123.2人机接口设备平台简介 123.2.1 USB控制器方案 133.2.2 ST2211U芯片简介 143.3 主要功能 143.4 本章小结 154 基于VC的HID上位机软件开发 154.1 Windows驱动程序模式 154.1.1 Windows驱动方式 154.1.2 WDM驱动程序的分层结构 164.2 USB接口HID类驱动原理 164.2.1 USB设备驱动体系 174.2.2 与HID设备通信的主要API函数 184.3基于VC的应用程序开发 184.3.1 开发流程 194.3.2 打开设备功能模块 234.3.3 LCD显示功能模块 234.3.4 键盘功能模块 244.4 本章小结 255 HID设备软硬件设计与实现 255.1 HID设备系统设计 255.2 HID功能模块设计与实现 255.2.1 USB HID驱动开发 295.2.2 LCD驱动开发 305.2.3键盘驱动开发 325.3本章小结 336 整机系统调试 336.1 调试流程 336.2 Bus Hound调试工具简介 336.3 HID设备接口通信调试 346.4基于VC的应用软件调试 366.5测试结果 397 总结与展望 40参考文献 41附 录 54谢 辞 1 绪 论 1.1选题背景 随着计算机硬件飞速发展,外围设备日益增多,键盘、鼠标、调制解调器、打印机、扫描仪早已为人所共知,数码相机、MP3随身听接踵而至,这么多的设备,如何接入个人计算机?为了满足用户的需求,以Intel 为首的七家公司(Intel, Compaq, Microsoft, IBM, DEC, Northern Telecom 以及日本NEC) 于1994 年11月推出了USB (Universal Serial Bus,通用串行总线)协议的第一个草案专用于低中速的计算机外设。 USB可把多达127个外设同时连到用户的系统上,所有的外设通过协议来共享USB的带宽,其12Mbps的带宽对于键盘鼠标等低中速外设是完全足够的。USB允许外设在主机和其它外设工作时进行连接配置使用及移除,即所谓的即插即用(Plug & Play)。同时USB总线的应用可以清除PC 上过多的I/O 端口,而以一个串行通道取代,使PC与外设之间的连接更容易。自从1996 年2月USB规范版本1.0 发布,随着微软在Windows 98中内置了对USB接口的支持模块,加上USB设备的日渐增多,USB接口逐步走进了实用阶段。短短几年间,USB不光成为了微机主板上的标准端口,而且还成为了所有微机外设(包括键盘、鼠标、显示器、打印机、数字相机、扫描仪和游戏柄等)与主机相连的标准协议之一。 目前USB规范的主要版本是USB1.1、USB2.0、USB2.0及USB3.0,USB2.0向下兼容USB1.1。USB1.1规定了低速1.5Mbps和全速12Mbps两种传输速率,USB2.0又增加了高速传输,最高传输速率达到480Mbps。USB论坛把不同的USB设备进行归类并制定了相应的设备类规范,设备类规范规定了该类设备的行为和协议。其中,人与计算机交互的设备,定义为HID类设备,用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,VCR遥控等等设备。另外,使用HID设备的好处之一就是,操作系统自带了HID类的驱动程序,而用户无需去开发很麻烦的上位机驱动程序,只要直接使用API调用即可完成通信。所以很多简单的USB设备,喜欢枚举成HID设备,这样就可以不用安装驱动而直接使用。 1.2选题目标 基于HID的人机接口设备的设计及应用开发包括两个方面:主机端与设备端。HID设备端,即下位机方面,采用APG8021开发平台,该平台的ST221U微控制器,内置USB控制器,支持USB全速设备(12Mbps)。在开发平台上,需要开发的驱动有USB HID驱动、键盘驱动及LCD驱动,这些是本项目的难点。主机端,即上位机方面,设备端为USB HID设备,属于用HID类设备——USB的标准设备类之一,故而无需开发内核模块客户驱动程序,因为Win98之后的操作系统基本都提供了HID类驱动程序,故只需开发客户程序,调用HID类驱动程序提供的Win32 API服务,即可实现与设备端通信。本项目通过键盘与LCD显示功能,演示了设备端与主机端之间的通信。 1.3需求分析 1.3.1用户需求分析 随着电脑的普及,USB接口技术的飞速发展,使得越来越的外围设备都提供了USB接口。开发一个读卡器、键盘、鼠标等等设备,提供USB接口是必不可少的。这不仅关系到用户的使用感受,也影响了产品的易用性与方便性。学习USB接口技术已经成为势不可挡的潮流。 USB连接的优点数不胜数,即插即用是其最大的特色,也是推动USB发展的重要因素之一。即插即用的特性不仅为USB接口赢得了声誉,更赢得了广大消费者的青睐。自微软提供了USB驱动以来,只要有电脑的地方,就离不开USB接口技术,足见其发展势头之强大。不仅如此,无线USB也已悄然盛行。这意味着,新的USB时代的即将到来。 市场价值推动技术发展,为了简化USB总线开发流程,USB-IF将常用的具有相同或相似功能的设备归为一类,并制定了相关的设备类规范,使得不同的厂商开发的USB设备可以使用同样的驱动程序。本项目中的USB HID设备即是基于HID类开发的,定义此类设备则无须编写主机端的USB驱动程序,大大降低了开发难度。无须安装驱动这一诱人的特性,不仅增强了其在同类产品中的竞争力,也使得用户使用起来更加方便,开发基于HID的人机接口设备有着巨大的市场价值。 1.3.2功能需求分析 (1) 数据通信功能。用户在上位机端点击“打开设备”按钮,主机端进行设备配置,为下一步的数据传输做准备。 (2) 键盘功能。设备端的按键按下,LCD显示相应的数值,主机端亦可读取相应的键值。 (3) LCD显示功能。显示主机与设备的通信数据。 1.4主要内容 基于HID人机接口设备的设计及应用的主要内容有:主机端的客户程序的编写;设备端各驱动模块的开发,包括USB HID驱动、LCD驱动以及键盘驱动。 主机端方面:客户程序是指在主机上运行的,负责与HID设备通信的应用程序。对于USB接口的HID设备,Win98之后的操作系统都提供了HID类驱动。不需要再编写内核模式下的驱动程序,只要调用Win32 API来访问HID设备即可。 设备端方面:采用APG8021平台,该平台的ST2211U 8位集成微处理器,提供了USB控制器、Smart Card控制器,广泛应用于读卡器等消费产品。USB HID驱动模块定义了USB接口的描述符,这些描述符定义了改HID设备的基本信息。键盘驱动模块采用行列扫描法实现了4*5键盘。LCD模块则通过ST7070控制器来驱动LCD显示。USB HID驱动的开发是本项目的重点与难点。 1.5本章小结 本章主要介绍本项目的选题背景、意义,选题目标、项目需求分析以及主要内容。开发一个人机接口设备需要做很多硬件和软件的工作,包括设计人机接口设备的硬件,编写设备协议,开发设备驱动程序等等,通过这些工作我对USB协议的整个体系有了比较清晰的认识。 2 USB接口技术介绍 2.1 USB接口技术 2.1.1 USB简介 USB是一种支持热插拔的高速串行传输总线,它使用差分信号来传输数据,最高速度可达480Mb/S。USB 支持“总线供电”和“自供电”两种供电模式。在总线供电模式下,设备最多可以获得500mA 的电流。USB2.0被设计成为向下兼容的模式,当有全速(USB 1.1)或者低速(USB 1.0)设备连接到高速(USB 2.0)主机时,主机可以通过分离传输来支持它们。一条USB 总线上,可达到的最高传输速度等级由该总线上最慢的“设备”决定,该设备包括主机、HUB 以及USB 功能设备。 2.1.2 USB 的总线拓扑结构 整个USB总线拓扑体系由三个元素组成:主机(Host)、集线器(Hub)和设备(device)。USB设备是通过USB总线连接到USB主机上的。整个USB的物理连接是一个菊链式星型拓扑结构,如图2-1所示。 图2-1 USB总线拓扑图 每个USB的系统有且只有一个主机,它负责管理整个USB系统,包括USB设备的连接与删除、主机与USB 设备的通信、总路线的控制等等。主机端有一个根集线器,可提供一个或多个USB下行端口。每个端口可以连接一个USB集线器或一个USB设备。以HOST-ROOT HUB为起点,最多支持7层(Tier),也就是说任何一个USB系统中最多可以允许5个USB集线器级联。一个复合设备(Compound Device)将同时占据两层或更多的层。USB集线器是用于USB端口扩展的,即USB 集线器可以将一个USB端口扩展为多个端口。图2-1中的每个功能设备(Func)就是一个USB设备,如USB键盘、USB鼠标、USB MODEM、USB硬盘等等。复合设备是指带一个集线器和一个或多个不可删除的USB设备的复合设备。一个USB系统可连接多达127个设备。 理论上,一个USB主控制器最多可接127个设备,这是由数据包中的7位地址位决定的,但是实际上不会接这么多的设备。一个USB主控制器可以连接多个USB设备,并不是直接简单的将多个设备并联或者串联,而是要由集线器负责端口扩展,才能连接更多的设备。在我们的电脑上,也有一个(或者多个,视USB主控制器的个数而定)集线器,它叫做根集线器,直接连在USB主控制器上。 2.1.3 USB系统分层 为了便于理解主机和USB设备间的数据传输机制,图2-2对USB系统的分层结构进行了更为详细的描述。从逻辑上看,客户软件通过一组管道来与USB设备的功能单元进行通信;USB系统软件和USB逻辑设备间的通信是通过缺省控制管道0来实现的;所有实际的USB数据传输是由主机和USB的串行接口引擎(SIE)来完成的。 各应用软件-功能设备对之间的通讯相互独立,应用软件通过USB 设备驱动程序(USBD)发起IRQ 请求,请求数据传输。主机控制器驱动程序(HCD)接收IRQ 请求,并解析成为USB传输和传输事务(Transaction),并对USB 系统中的所有传输事务进行任务排定(因为可能同时有多个应用软件发起IRQ 请求)。主机控制器(Host Controller)执行排定的传输任务,在同一条共享的USB 总线上进行数据包的传输。 图2-2 USB系统分层 2.1.4 USB的编码方式 对于一个设备而言,不仅要无误的接收主机端送来的数据,更要正确的发出响应信号,因此,在D+与D-差动数据线上就必须采用一种特别的编码方式再加以传送出去,以解决在USB线缆所产生信号延迟及误差等问题。USB采用NRZI(Non return to zero invert)的编码方式,无需同步的时钟信号也能产生同步的数据存取。NRZI的编码规则是:当数据为“1”时不转换,为“0”时再作转换。图2-3是NRZI编码的一个实例。 图2-3 NRZI编码 但是NRZI编码方式容易出现“塞车”现象。所以需要执行“位填塞”工作。即连续6个“1”后填一个“0”。因此在发送端作数据传输之前,需要先执行位填塞和NRZI编码,而在接收端接收数据之前,需要先执行NRZI译码再作位反填塞。这一部分的电路会通过USB模块中的串行接口引擎(SIE)来实现。 2.1.5 USB的即插即用 USB即插即用包括两方面,一是热插拔,一是自动配置。热插拔依赖于物理上的实现,自动配置则依赖于软件设计。 USB采用四线电缆来传输信号于电源,如图2-4。其中D+,D+为差分信号线,VBus和GND则提供了+5V的电源。USB正是在电缆和连接点的设计上做了处理,使得热插拔所产生的强电流可以被吸收。 图2-4 USB电缆 至于自动配置,主要是指设备在插入HUB下行端口后能被主机自动识别,进行信息交换。这一功能主要依赖USB总线枚举来实现。总线枚举的具体实现在5.3节。 2.2 USB接口HID设备类 2.2.1 HID设备类简介 要完成一个USB设备的开发,仅了解USB协议是不够的。还需要知道USB设备类协议,USB协议与USB设备类协议是相互补充的。为了简化USB总线开发流程,USB-IF将常用的具有相同或相似功能的设备归为一类,并制定了相关的设备类规范,使得只要依照统一规范标准,不同的厂商开发的USB设备可以使用同样的驱动程序。所有的设备类都必须支持标准USB描述符和标准USB设备请求,如有必要,设备类还可自行定义其专用的描述符和设备请求,这分别被称为设备类定义描述符和设备类定义请求。另外,一个完整的设备类还将指明其接口和端点的使用 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 ,如接口所包含端点的个数、端点的最大数据包长度等。 USB设备分为两大类:标准型的和非标准型的。标准型的,比如音频设备、通信设备、打印机设备、存储设备和本项目采用的HID设备等。而非标准型的,比如USB/RS-232转换器等。 HID设备属于人机交互操作的设备,它既可以是低速设备,也可以是本项目采用的全速设备。其典型的数据传输类型为中断IN传输,适用于主机接收USB设备发来的少量数据。HID设备具有以下的功能特点:适用于传输少量到中量的数据;传输的数据是突发性的;有最大传输速度的限制;没有传输速度的保证。 2.2.2 HID数据传输方式 HID设备类仅仅支持USB4种传输模式中的两种,即控制传输和中断传输。如表2-1。 表2-1 数据传输管道 特点 HID支持程度 控制管道 利用控制传输方式,传输标准的请求命令数据,以及各种用于主机轮询设备时的消息数据 必须支持 中断输入IN管道 利用中断传输方式,把数据从设备发送给主机 必须支持 中断输出OUT管道 利用USB的中断传输方式,把数据从主机发送给设备 可选 控制传输:是USB中最重要的传输类型,只有执行控制传输后,才能够进一步执行其他的传输类型。这种传输主要用于发送和接收与USB设备配置信息有关的数据,如设置设备地址、读取设备描述符等。所有的USB设备必须支持控制传输,并且都将端点0构成的管道作为缺省控制管道。当设备首次连接到主机上时,就是用缺省控制管道传输USB设备的确认信息、状态信息以及控制信息。控制传输的优先级最高。 控制传输至少有两个事物阶段:建立阶段和状态阶段,在两者之间可能存在数据阶段。建立阶段,建立事物向外设的控制端点传输信息,PID是SETUP,数据的PID使用DATA0。收到SETUP包的外设必须接收,并向主机发送ACK信号;如果数据被损坏则将其丢掉,不返回ACK信号。控制阶段如果存在数据阶段的话,所有的数据阶段的事物必须有相同的方向,在数据阶段中要发送的数据大小和方向在建立阶段给出。控制传输的状态阶段是最后一个操作,并且其传输的方向总是与数据流的方向相反,其PID总是DATA1。 中断传输:由于USB不支持硬件的中断,必须靠PC主机周期性的轮询,以便获知是否有设备需要传送数据给PC。由此可知,中断传输仅是一种轮询的过程,而非我们过去所认知的中断功能。轮询的周期非常的重要,太低的话,数据可能会流失,反之太高的话,会占去太多的总线带宽。对于全速装置(12Mbps)而言,仅能设定10ms与255ms的轮询间隔,如果因为错误发生传送失败的话,可以在下一个轮询期间重新再传送一次。 2.2.3 HID设备枚举过程 (1) 主机检测到USB设备插入; (2) USB设备复位,主机使用缺省地址0,向设备发送get_device_descriptor请求,来得到端点0 的buffer的大小; (3) 主机发送set_address请求,分配一个地址给设备; (4) 主机再次发送get_device_descriptor请求给设备,获取设备描述符; (5) 设备发送device descriptor给主机; (6) 主机发送get_configuration_descriptor请求给设备,第一次发送会得到后面所有描述符的总长度; (7) 主机再次发送get_configuration_descriptor请求给设备; (8) 设备返回后面所有的描述符,包括(配置、接口、端点描述符,HID描述符) (9) 总线枚举过程结束,设备开始正常工作。 2.2.4 HID设备类描述符 USB是通用串行总线,是用来传输数据的。而描述符是为了告诉主机,设备是做什么的,实现什么功能,有哪些操作。USB协议为USB设备定义了一套描述设备功能和属性的有固定结构的描述符,包括设备描述符、配置描述符、接口描述符、端点描述符、字符串描述。每个USB设备仅有一个设备描述符,设备描述符可以包含一个或多个配置描述符,设备的每一张配置又可以包含一个或多个接口描述符,一个接口使用几个端点,就有几个端点描述符。在USB主机访问USB设备的时候,是一级一级获取描述符的。如图2-5所示。USB设备通过这些描述符告诉主机设备的各种属性,主机通过对这些描述符的访问对设备进行类型识别、配置,并为其提供主机端的驱动程序。 图2-5 HID设备描述符结构图 HID设备类除了标准描述符(包括设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还有自己的专有描述符:HID描述符、报告描述符、物理描述符。正确实现HID设备类专用描述符是主机成功识别HID设备的关键。HID描述符和报告描述符是必须要使用的,物理描述符一般不被使用。本项目具体的HID属性描述符将在5.2.1节进行介绍。 2.3本章小结 本章简要的介绍了USB及HID设备类的一些特性,包括USB总线拓扑结构、USB的枚举过程、USB的传输类型等。 3 人机接口设备系统设计 3.1系统框架 人机接口设备系统设计包括两部分:主机端的客户驱动程序设计和设备端各个模块驱动设计。系统框架如图3-1所示。 主机端的客户程序是指在主机上运行的,负责与HID设备通信的应用程序。主机要使用USB HID设备,必须要有驱动程序。HID类驱动程序为内核模式和用户模式的程序提供了API(应用程序接口),可用来编写基于HID类的应用程序。对于USB接口的HID设备,只需调用Win32 API来编写用户模式下的应用程序,即无需编写基于类驱动程序的内核模式下的客户驱动程序。 设备端的MCU采用ST2211U 8位集成微处理器,该微处理器提供了32K字节ROM、2K字节的SRAM、USB控制器、Smart Card控制器及中断控制器等,广泛应用于PDA,智能卡读卡器等消费产品。HID驱动模块定义了USB接口的描述符,包括设备描述符、配置描述符、接口描述符、端点描述符、HID描述符及报告描述符。这些描述符定义了HID设备的基本信息。键盘驱动模块使用GPIO口中的PA[4:0]为列线和PB[7:4]为行线,采用行列扫描法实现4*5键盘驱动。LCD模块则通过3线SPI向ST7070发送控制命令,并由ST7070控制器来驱动LCD显示。 图3-1 系统框架图 3.2人机接口设备平台简介 3.2.1 USB控制器方案 本系统使用的平台是由乐毅软件科技有限公司开发的APG8021平台。该平台基于ST2211U微处理器,最高主频可达8MHz。该平台支持人机接口,提供数位键盘和高对比度的显示屏,此显示屏可显示2行,每行16个字符;采用智能电池管理,支持2节AAA电池(可移除),电池使用寿命长达五年;支持Smart Card接口,能读取IS0-7816 A,B,C(5V,3V,1.8V)级的卡,可应用于多种银行应用中,典型的有网上银行,电子商务,电话购物等。图3-2为APG8201开发板平台图。 图3-2 APG8201开发板平台图 在开发一个USB 人机接口设备的时候,首先要根据使用要求选择合适的USB控制器。USB控制器选择有两种方案,一种是采用外接的USB接口芯片,另一种则是带USB接口的单片机(MCU)。 纯粹的USB接口芯片仅处理USB通信,必须有一个外部的微控制器来进行协议的处理和数据的交换。典型产品有Philips公司的PDIUSBD11(I2C接口)、PDIUSBD12(并行接口),NS公司的USBN9603/9604(并行接口),NetChip公司的NET2888等。USB接口芯片的特点是价格便宜、接口方便、可靠性高。使用USB接口芯片所能实现的功能有限,只处理与USB相关的通信工作,而且必须由外部微控制器对其控制才能正常工作,这类芯片必须提供一个串行或并行的数据总线与微控制器进行连接,此外还需要一个中断引脚,当数据收到或发送完,这个中断引脚会发出中断请求信号。 本项目采用了带USB接口的ST2211U,此方案不需要外接微处理器,最大的好处是开发者对系统结构和指令集非常熟悉,相关资料丰富,易于进行开发。 3.2.2 ST2211U芯片简介 ST2211U芯片是个8位集成微控制器,带有硅栅CMOS技术。真正的静态CPU核心、电源中断模式结合双振荡器的设计,使得ST2211U适合于省电且长的电池生命设计。ST2211U芯片整合各种逻辑,以支持系统设计者所需要的片上功能。这对于系统复杂度低,尺寸小,低成本来说很重要。 ST2211U以内存访问最大达32M字节的容量,适合大数据量的产品为特性。为扩展ROM,SRAM或者其他设备配置了两个芯片的选择。最大的单个设备内存占8个字节也是有可能的。 一个DMA通道保证了高速数据传输的可能性与易用性。源指针及目标指针都可以指向整个带15位指针的内存空间及空寄存器。 ST2211U芯片有28个I/O口,分成4个端口,Port-A ~ Port-D。每个针脚都可以进行输入或输入编程。有两种选择:将Port-C上拉或者下拉为输出,并且仅上拉其他端口为输入。一旦输出,Port-C就有开汲式或者CMOS方式可以选择,其他端口仅使用CMOS方式。当Port-B/C/D具有其他系统功能时,Port-A设计成为去反弹且能触发中断的键盘扫描端口。当被分配其他功能的时候,所有的I/O口都可再编程。这样扩展了功能信号的灵活性。 ST2211U配置了一个SPI串行通信端口来满足不同的通信方式。 USB通信方式应用越来越广泛,ST2211U以一个PLL,一个3.3V稳压器,以及一个USB2.0全速设备引擎来满足市场大数据传输的需求。不仅支持固件库、Windows驱动,还支持HID、Smart Card及Mass Storage三大类。 Smart card的接口是ST2211U芯片的另一个的特性。ST2211U支持ISO7816-3、EMV这些智能卡标准。这个接口可以使用USB与计算机使用CCID协议进行通信。 ST2211U芯片为电源管理配置了一个低电压探测器。外部电源状态可以被检测,并报告给管理软件。内置的看门狗是良好设计的必备功能。 ST2211U为有效率的开发流程配置了ICE调试接口。不仅具有硬件模拟器,软件模拟器也同时节省了开发者进行系统设置与编程。 集成了上述的功能,ST2211U单芯片微处理器适用于读卡器、PDA、翻译器、电子记事本及其他消费性产品。 3.3 主要功能 应用界面模块调用了如HidD_GetHidGuid,SetupDiGetClassDevs,CreaterFile,HidD_GetAttributes等API函数对人机接口设备进行枚举,枚举完成后即可对其进行读写。 HID驱动模块,编写了设备描述符、配置描述符、接口描述符、端点描述符、HID描述符以及报告描述符。实现了HID设备配置过程。 键盘模块,实现了0~9这10个数字键,以及清除键的功能。 LCD模块,实现LCD显示功能,可以清晰的显示设备与主机交流的数据,如键值等。 3.4 本章小结 本章描述了本项目的系统框架,并对开发平台APG8201进行了简要介绍,以及各个主要模块的功能描述。 4 基于VC的HID上位机软件开发 4.1 Windows驱动程序模式 4.1.1 Windows驱动方式 Windows设备驱动方式主要有三类:即VxD(虚拟设备驱动程序)、KMD(内核模式驱动程序)和WDM(Windows设备驱动程序模型)。 VxD(Virtual X Driver),用于对各种硬件资源识别,管理、维持着系统的运作。VxD运作在INTEL系列CPU保护模式下的RINGO,拥有对硬件的最高控制权。 KMD(Kernel Mode Driver),该类驱动程序运行于Windows NT的KERNEL模式下,类似于RING0。VxD和KMD是两种不同的驱动程序,同一设备在不同的操作系统下,要分别编写驱动程序。 WDM(WIN32 DRIVER MODEL)即WIN32设备驱动程序模型,是微软从Windows 98开始,推出的一个新的驱动类型,它是一个跨平台的驱动程序模型,不仅如此,WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行,毫不夸张地讲,WDM算得上是21世纪的驱动程序框架。它旨在简化驱动程序的开发,在实现对新硬件支持的基础上,减少开发驱动程序的数量和降低驱动程序复杂性。WDM驱动程序模型,统一驱动程序架构,实际上WDM驱动程序,具有Windows NT内核态驱动程序、Windows95即插即用和电源管理特性。 WDM除了核心模型描述设备驱动程序的标准结构外,还为常见类型的设备实现了一个模块化的、分层次类型的总线驱动程序和类驱动程序。WDM是一种通用的驱动模式,总线驱动程序支持通用串行总线、IEEE 1394总线等,类驱动程序则为实现标准Windows功能提供条件。WDM支持跨平台,编写的WDM驱动程序可以在Windows98, Windows2000, Windows XP下运行。 4.1.2 WDM驱动程序的分层结构 WDM体系结构实现分层处理,即设备驱动被分成了若干层,每层驱动再把I/O请求划分成更简单的请求,以传给下次驱动执行。最底层驱动程序在收到I/O请求后,通过硬件抽象层,与硬件发生作用,从而完成I/O请求工作。驱动程序模型如图4-1所示。此外,WDM模式引入了两个新类描述硬件,一个PDO对应一个真实硬件,一个硬件只允许一个PDO,但可以有多个FDO,在驱动程序中,我们不直接操作硬件而是操作相应的PDO与FDO。 图4-1 WDM驱动程序体系结构 用户模式与内核模式通讯流程是:应用程序通过WIN32提供的API调用,向WIN32子系统发出命令;WIN32子系统通过标准的系统调用与内核层的I/O管理器通讯,将用户程序的API调用转换成IRP (I/O Request Package)包;I/O管理器将1RP包传递给指定的设备驱动程序;设备驱动程序再将IRP转换为相应的硬件抽象层HAL(Hardware Abstraction Layer)调用并传递给HAL层,最后由HAL与硬件直接打交道,得到用户程序需要的数据,并沿原路通过设备驱动程序、I/O管理器和WIN32子系统返回到用户程序。 4.2 USB接口HID类驱动原理 4.2.1 USB设备驱动体系 USB设备驱动程序是基于WDM的,USB驱动程序的构成层次如图4-2所示。其中USB客户驱动程序通过Windows系统提供的USB类驱动程序接口(USBDI)与下层驱动程序通信。在USB设备可用之前,必须对其进行配置和接口选择,然后所选择的接口的各个管道才是可用的。在USBDI的基础上进行编程将大大简化,用户不用关心IRP的类型,而只需要在相应的分发例程中通过构造USB块并将其通过USBDI发送下去就可以实现对USB设备的控制了。 图4-2 USB驱动程序的WDM结构 4.2.2 与HID设备通信的主要API函数 Windows系列操作系统都内置了USB HID类别驱动程序,因此不用额外开发相应的USB类驱动和总线驱动。 Windows这个多作业系统除了协调应用程序的执行、分配内存、管理系统资源之外,同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以便称之为 Application Programming Interface,简称API函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。凡是在 Windows工作环境底下执行的应用程式,都可以调用Windows API。 应用软件和HID设备交换数据的过程如下:在交换数据前,应用软件必须先识别该设备,并且读取它的报表信息;这些动作需要调用一堆Windows API函数。应用软件首先需要寻找连接到系统上的是哪些HID设备,然后检验每个信息,直到找到所需的属性。如果是客户化的设备,应用软件可以找到特定的厂商ID和产品ID。表3-1是Windows用来与HID通信并交换数据的主要API函数。 表4-1 Windows与HID通信的主要API函数 API函数 DLL文档 用途 HidD_GetHidGuid Hid.dll 取得HID类别的GUID SetupDiGetClassDevs Setupapi.dll 传回一个设备信息群 SetupDiEnumDeviceInterfaces Setupapi.dll 传回设备信息群的一个设备信息 SetupDiGetDeviceInterfaceDetail Setupapi.dll 传回设备的路径 SetupDiDestroyDeviceInfoList Setupapi.dll 西方类设备所使用的资源 CreatFile Kernel32.dll 开启设备的通信 HidD_GetAttributes Hid.dll 传回厂商的ID和产品ID HidD_GetPreparsedData Hid.dll 传回设备能力信息的缓冲区代号 HidD_GetCaps Hid.dll 传回描述设备能力的结构 HidD_FreePreparsedData Hid.dll 释放GetPreparseData占用的资源 WriteData Kernel32.dll 发送一个输出报表给设备 ReadFile Kernel32.dll 从设备读取一个输入报表 HidD_SetFeature Hid.dll 发送一个特征报表给设备 HidD_GetFeature Hid.dll 从设备读取一个特征报表 CloseHandle Kernel32.dll 释放CreateFile所使用的资源 4.3基于VC的应用程序开发 4.3.1 开发流程 本项目的上位机程序是基于Microsoft Visual C++ 6.0集成开发环境完成的。其中,MFC(Microsoft Foundation Classes)是微软提供的类库,以C++类的形式封装了Windows的API,并且包含了一个应用程序框架。MFC是Win API与C++的结合,是面向对象程序设计与Application Framework的完美结合,他将传统的API进行了分类封装,并且创建了程序的一般框架,大大减少了应用程序开发的工作量。 用户界面的工作流程如下:应用程序初始化,显示初始界面;点击打开设备按钮,即开始查找设备;若找到目标HID设备,则加载人机接口设备,并启动USB通信;若启动LCD显示数据功能,则向人机接口设备发送数据并显示在LCD上;若启动开发板键盘功能,则可获取人机接口设备上被按下的键值并返还给主机。如图4-3所示。 图4-3 界面开发主程序流程图 4.3.2 打开设备功能模块 HID类驱动程序及HID.DLL提供了两类读写USB 设备的函数。一类是以HidP 为前缀,适用于内核模式的客户驱动程序。另外一类是以HidD为前缀,适用于用户模式的客户程序。利用这些函数编制读写人机接口设备的步骤如下: (1) 取得HID类的GUID。 在应用软件和HID设备通信前,它必须先取得HID类别的GUID。GUID是一个128位的数值,每个对象都有唯一的GUID。 HidD_GetHidGuid ( OUT LPGUID HidGuid ); (2) 获得指向HID设备集合句柄。 SetupDiGetClassDevs函数查询所有已安装的HID 设备,得到一个指向该HID 设备集合的句柄。 SetupDiGetClassDevs( IN LPGUID ClassGuid, OPTIONAL IN PCSTR Enumerator, OPTIONAL IN HWND hwndParent, OPTIONAL IN DWORD Flags ); (3) 识别HID接口。 SetupDiEnumDeviceInterfaces函数用来读取识别一个接口的结构的指针,每一次调用必须传递一个数组索引来指定一个接口。 SetupDiEnumDeviceInterfaces( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN LPGUID InterfaceClassGuid, IN DWORD MemberIndex, OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ); (4) 获取目标设备详细信息。 对每一个接口,调用SetupDiGetDeviceInterfaceDetail函数获取其详细的信息,包括设备名称(头四个字节),CreateFile用此设备名打开设备。 SetupDiGetDeviceInterfaceDetail( IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData, OPTIONAL IN DWORD DeviceInterfaceDetailDataSize, OUT PDWORD RequiredSize, OPTIONAL OUT PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL ); (5) 打开设备。 调用CreatFile 函数打开设备。 CreateFile( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); (6) 获取USB 设备的有关属性。 调用HidD_GetAttributes获取设备的零售商ID、产品ID 及产品的版本号等。如果获取成功,则将属性中的VID、PID以及设备版本号与我们的目标设备进行比较,如果一致,则是目标设备,则使用读写方式打开目标设备。 BOOLEAN __stdcall HidD_GetAttributes ( IN HANDLE HidDeviceObject, OUT PHIDD_ATTRIBUTES Attributes ); (7) 释放设备信息集合。 SetupDiDestroyDeviceInfoList函数释放设备节点及内存分配。 WINSETUPAPI BOOL WINAPI SetupDiDestroyDeviceInfoList( IN HDEVINFO DeviceInfoSet ); 图4-4 即为VC中调用Windows API函数打开HID设备的流程图。 图4-4 打开设备流程图 在完成打开设备功能之后,主机便可与HID设备进行通信了。主机在接收报告的时候,需要从报告中提取数据。由于报告中包含了各种类型的数据,为了便辨别不同类型的数据,HID 类提供了HidP_GetXxx 例程,从设备中读取不同类型的数据。如果程序员知道各个数据的含义,则可直接使用ReadFile 函数读出数据。同样,主机发送数据给设备的时候,也要先创建报告;为了方便发送不同类型的数据给设备,HID 类提供了HidP_SetXxx 函数。当然,如果程序员知道各个数据的含义,也可以直接使用WriteFile 函数将报告传给设备。在LCD显示与键盘键盘功能模块上,我们使用HidD_SetFeature来传送一个特征报文给HID设备。 HidD_SetFeature ( IN HANDLE HidDeviceObject, IN PVOID ReportBuffer, IN ULONG ReportBufferLength ); 4.3.3 LCD显示功能模块 LCD显示功能模块,首先用函数GetDlgItemText从文本框获取用户输入信息,并设置报告缓冲区第1字节为0x01(自定义),开启LCD显示功能。 主要代码如下: ReportBuffer[0] = 0x00; //ReportBuffer为报文缓冲区 ReportBuffer[1] = 0x01; //Display command ReportBuffer[2] = sendLen; HidD_SetFeature(hDevHandle, ReportBuffer, 0x21); 读写报文缓冲区时,第一个字节是Report ID,其后是报文数据。报文缓冲区默认是八个报文,并且环状排列。因为数据读写是发生在主机轮训设备的时候,并不是由设备触发产生硬件中断,所以如不能及时读写,新的数据会覆盖旧的数据,导致生报文丢失。当数据读写频繁时应使用特征报文,它可以保证当报文数据没有变化时,HID不会传送新的数据。当设备接收到该命令,设备将启动LCD功能模块显示最多30个字符到LCD屏上。LCD命令定义,见表4-2。 表4-2 LCD命令定义 偏移量 域 大小(字节) 值 描述 00h bLCDCmd 1 01h 01h bLength 1 定义显示字符的长度 02h abData bLength 显示在LCD上的字符 03h+bLength abRandomData 29-bLength 随机数 4.3.4 键盘功能模块 键盘功能模块,可启动开发板的键盘功能,并读取键值。需将报告缓冲区第1字节设置为0x02(自定义)。主要代码如下: ReportBuffer[0] = 0x00; ReportBuffer[1] = 0x02; //Read key command HidD_SetFeature(hDevHandle, ReportBuffer, 0x21); 当HID设备接收到该命令,设备将在LCD上显示“Enter Data:”以提示用户,并调用按键功能模块等待用户输入按键,用户只能输入0~9之间的按键,但输入的按键达到最大长度6或者有Enter键按下时,设备返回所有所按的按键给PC,读取键值流程结束。按键命令定义见表4-3。 表4-3 按键命令定义 偏移量 域 大小(字节) 值 描述 00h bKeyCmd 1 02h 读键值命令 01h abRandomData 31 31个字节的随机数 4.4 本章小结 本章详细介绍了主机端(上位机)应用程序设计。详细分析了打开设备功能模块,设备枚举的流程,键盘功能模块与LCD功能模块。 5 HID设备软硬件设计与实现 5.1 HID设备系统设计 本项目的人机接口设备端需要硬件设计与软件设计,硬件方面包括芯片选择、电路图的设计等。软件方面,即固件代码,包括USB协议栈的编写、键盘驱动及LCD驱动的编写。这些都是项目开发的重点与难点。 USB设备端的软件开发实际上包含着很大的工作量,因为开发者需要在自己的平台上实现一个USB 设备端的协议栈。简单说来,USB设备端的软件主要需要两个功能:一是监视设备的状态,控制设备的行为,自动产生状态信息和用户命令信息;二是完成主机与设备之间的USB总线通讯,自动处理主机的控制和查询命令。实现前一个功能的软件模块我们称为USB 设备的通用模块,而实现后一个功能的软件模块我们称为USB 设备的协议模块。 5.2 HID功能模块设计与实现 5.2.1 USB HID驱动开发 (1)固件流程图 USB设备作为一个完整的硬件设备,由硬件和固件两部分组成。其中,固件包括有关系统配置和CPU的一些设置模块、USB协议栈模块等部分。图5-1为本项目中USB设备固件流程图。 图5-1 USB固件流程图 (2)HID属性描述符 如2.2.4所述,HID类支持标准的USB描述符,即设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。此外,作为一个特定的设备类,HID有其独有的类描述符,即HID描述符、报告描述符和物理描述符。 下面主要介绍本项目使用的HID描述符、端点描述符与报告描述符。 HID描述符跟接口描述符、端点描述符类似,也是随配置信息一起返回给主机的,主机并不会单独发出请求来读取它。HID描述符在配置信息中的位置是紧接接口描述符。 HID描述符详细设计如下: HID_CLASS_DESCRIPTOR: DB 09H ;bLength域,HID描述符的长度为9个字节 DB 21H ;bDescriptorType域,描述符种类为HID类描述符 DB 00H ;bcdHID域,HID规范版本号为0x0100 DB 01H DB 00H ;bCountryCode域,不支持硬件的目的国家识别码 DB 01H ;bNumDescriptors域,支持的附属描述符数为1,即报告描述符 DB 22H ;bDescriptorType域,HID相关描述符为0x22,即报表描述符 DB 30H ; bDescriptorLength域,报告描述符的总长度0x0030,即48字节 DB 00H 端点描述符详细设计如下: ENDPOINT_DESCRIPTOR_INTERRUPT_IN: DB 07H ;bLength域,端点描述符长度为7个字节 DB 05H ;bDescriptorType域,描述符种类为端点描述符 DB 83H ; bEndpointAddress,端点号为3 DB 03H ;bmAttributes域,端点号为3的端点是Interrupt In端点 DB 08H ;wMaxPacketSize域,0x0008 DB 00H DB 10H ;bInterval域,轮询间隔为2 ms 报告描述符,顾名思义就是描述“报告”格式的,这个格式使主机和设备能遵循着同一个规则来解释一个报告中所含有的数据。“报告”是主机和HID设备之间进行数据交换的最小单位。也就是说,在主机完成对设备的识别之后,在具体应用上的数据交换就得以“报告”的方式进行。“报告”的类型有三种:输入报告、输出报告和特征报告。输入报告就是设备发给主机的报告,而输出报告就是主机发给设备的报告,特征报告是主机发给设备的报告,特征报告常在自定义HID设备中被用作主机向设备发送自定义数据。通过报告,USB HOST可以分析出报告中数据所表示的含义,并通过控制输入端点0返回。另外,主机使用获取报告描述符命令来获取报告描述符。注意,该请求是发送到接口,而不是发送到设备。一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。当报告描述符中没有规定报告ID时,报告中就没有ID字段,而直接以数据开始。 与HID描述符不同,主机会发出单独的请求来读取报告描述符。关于报告描述符的组成,HID设备类定义文档中明确指出,一个报告描述符必须包含但不仅限于以下数据项:输入、输出或特征(指明了报告的类型);用法;用法页(用法和用法页一起指明了数据项的用法);逻辑最小值;逻辑最大值(逻辑最小值和逻辑最大值指明了报告所使用的数据值的范围);报告大小(指明数据项的位数);报告计数(指明有多少个这样的数据项)。 报告描述符详细设计如下: HID_REPORT_DESCRIPTOR: DB 06H ;用法页,0xFFA006,自定义,修饰其下所有主项 DB A0H DB FFH DB 09H ;用法,0x0109,局部项,只修饰下面集合主项 DB 01H DB A1H ;应用集合开始,01A1 DB 01H DB 09H ;用法,0x0209 DB 02H DB A1H ;物理集合开始,0x00A1 DB 00H DB 06H ;用法页,0xFFA106 DB A1H DB FFH DB 09H ;用法,0x0309 DB 03H DB 15H ;逻辑最小值(-127) DB 80H DB 25H ;逻辑最大值(128) DB 7FH DB 35H ;物理最小值(00) DB 00H DB 45H ;物理最大值(255) DB FFH DB 75H ;报告大小(8 bits) DB 08H DB 95H ;报告计数(8) DB 08H DB 81H ;输入(数据,变量,绝对值) DB 02H DB 09H ;用法,0x0409 DB 04H DB 15H ;逻辑最小值(-127) DB 80H DB 25H ;逻辑最大值(128) DB 7FH DB 35H ;物理最小值(00) DB 00H DB 45H ;物理最大值(255) DB FFH DB 75H ;报告大小(8 bits) DB 08H DB 95H ;报告计数(32) DB 20H DB B1H ;特征(数据,变量,绝对值) DB 02H DB C0H ;物理集合结束 DB C0H ;应用集合结束 5.2.2 LCD驱动开发 本项目采用ST7070点阵液晶显示控制器来驱动字符显示。ST7070控制器集成了显示RAM,字符发生器,液晶驱动模块。MCU只需利用3线SPI跟ST7070通信,通过写入一些控制命令给ST7070来控制ST7070驱动液晶屏达到显示字符等的目的。图5-2显示了LCD驱动器的原理框图。 图5-2 LCD驱动器原理框图 ST7070点阵式液晶显示控制器及LSI驱动器提供包括显示字母数字、片假名及符号的功能。在4/8位微处理器控制下,可以对ST7070进行配置,以驱动处理点阵式液晶显示器。外接的微处理器可以通过高速串行接口,如3线SPI或4线SPI直接控制ST7070。由于驱动一个点阵液晶显示器所需要的功能,例如,显示RAM、字符发生器和液晶驱动,都是由内部芯片提供的,故此控制器兼容了最小的系统。ST7070部分兼容了HD44780、KS0066和SED1278的功能,因此允许用户使用ST7070来代替它们。ST7070字符发生存储器可扩展至生产共达496个不同的5*8点阵式字型。ST7070提供了2.7V~5.5V的电源供应,适合低使用便携式电池驱动的低功耗产品。ST7070的LCD驱动器组成的16个通用信号驱动器和80段信号驱动器,可以通过级联段驱动器ST7921扩展其尺寸。最大的显示尺寸可以是一行80个字符或两行40个字符。单个ST7070可以显示最大可显示一行16个字符或两行16个字符。LCD驱动器初始化流程,如图5-3所示。 图5-3 LCD驱动器初始化流程图 5.2.3键盘驱动开发 本项目采用4*5矩阵键盘,在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图5-4所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。键盘是由一组规则排列的按键组成,一个按键实际上是一个开关元件。按键按下时,与此键相连的行线与列线导通,行线在无键按下时处在高电平,显然,如果让所有的列线也处在高电平,那么,按键按下与否不会引起行线电平的变化。因此,必须使所有列线处在低电平,只有这样,当有键按下时,该键所在的行电平才会由高电平变为低电平。CPU根据行电平的变化,便能判定相应的行是否有键按下。 图5-4 4*5矩阵键盘电路图 行列扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。项目中,ST2211U微控制器的GPIO口提供的I/O端口分为四组,Port-A/B/C/D。将行线所接的PB[7:4]口作为输出端,列线所接的PA[4:0]口作为输入端。识别方法:首先,判断键盘中有无键按下。将全部行线PB[7:4]置为低电平,然后逐一检测列线的电平状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。若确认有键按下,则要判断闭合键所在的位置。依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线置为低电平后,再逐行检测各列线的电平状态。若某列为低电平,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。图5-5为本项目的键盘驱动流程图。 图5-5 键盘驱动流程图 5.3本章小结 本章详细描述了设备端的各个模块驱动开发,USB HID驱动开发、LCD驱动开发及键盘驱动开发。 6 整机系统调试 6.1 调试流程 正确、合理的调试方法是成功开发一个USB人机接口设备必不可少的环节。本项目的调试过程分三步进行:首先,对于人机接口设备,借助PC调试软件Bus House,将设备端的USB协议,数据交换等调通;然后,使用调试好的人机接口设备接口开发上位机上的应用程序;最后,进行整机测试。 6.2 Bus Hound调试工具简介 Bus Hound软件是由美国perisoft公司研制的一种专用于PC机各种总线,数据包监视和控制的开发工具软件,其名"hound"的中文意思为"猎犬",即指其能敏锐地感知到总线的丝毫变化。 Bus Hound是一个超级软件总线协议分析器,用于捕捉来自设备的协议包和输入输出操作,其优良特性如下: 支持所有版本的IDE,SCSI,USB,1394总线;支持各类设备如硬盘库,DVD,鼠标,扫描仪,网络照相机等;支持Windows9X,WindowsMe,NT4.0,2000,2003,XP和嵌入式XP操作系统;捕捉数据的总量仅受机器内存限制;可以设置触发信号自动停止捕获操作;测试读取,同步等设备性能;捕获设备驱动包,例如IRP;捕获任意数量的并行设备,而不管其总线类型;易于交换与下载;捕获的数据易于拷贝到其它环境生成Html格式;捕获的数据能保存为文本文件或ZIP文件;所有的可捕获设备以树形结构列出,让选择设备来得更轻松些;可捕获设备的启动过程;用户爱好设定功能,如用户可调整捕获到的数据显示宽度,更宜于查看和使用;查看底层协议包括SCSI的sense数据和USB的设置包;查看每阶段的时间变化精确到微秒;将输入输出发生的操作实时显示到屏幕上;纯软件解决方案,不需要对硬件进行任何变更等等。 Bus Hound是一款可以查看USB总线数据的调试软件。Bus Hound的调试步骤如下:打开Bus Hound中的Devices页;在Devices页选中本项目的HID-compliant device;再转至Capture页,点击Run;插入HID设备。 6.3 HID设备接口通信调试 采用Bus Hound捕获数据,枚举过程数据获取如下: 表6-1 设备枚举数据捕获 传输类型 传输数据 描述 CTL 80 06 00 02 00 00 ff 00 获取配置描述符的FF个字节 DI 09 02 22 00 01 01 00 80 32 09 04 00 00 01 03 00 00 00 09 21 00 01 00 01 22 30 00 07 05 83 03 08 00 10 CTL 80 06 00 01 00 00 12 00 获取设备描述符的18个字节 DI 12 01 10 01 03 00 00 08 71 04 12 a1 01 00 01 02 00 01 设备描述符 CTL 80 06 00 02 00 00 09 00 获取配置描述符的9个字节 DI 09 02 22 00 01 01 00 80 32 配置描述符 CTL 80 06 00 02 00 00 22 00 获取设备描述符的34个字节 DI 09 02 22 00 01 01 00 80 32 配置描述符 09 04 00 00 01 03 00 00 00 接口描述符 09 21 00 01 00 01 22 30 00 HID描述符 07 05 83 03 08 00 01 端点描述符 其中,CTL表示:控制传输,DI表示数据输入。可根据Bus House捕获到的信息判断HID设备是否被正确的配置、识别,同此法,亦可获取数据交互的具体数据。 6.4基于VC的应用软件调试 VC的调试方法,首先必须使程序中包含调试信息。为了增加调试信息,可以按照下述步骤进行:打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开);选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式如表6-2所示。本项目采用Program Database for Edit and Continue的方式。 表6-2 VC调试信息方式 命令行 Project settings 说明 无 None 没有调试信息 /Zd Line Numbers Only 目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息 /Z7 C 7.0- Compatible 目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等 /Zi Program Database 创建一个程序库(PDB),包括类型信息和符号调试信息 /ZI Program Database for Edit and Continue 除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。 再选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL,如图6-1所示,本项目须添加hid.lib, setupapi.lib。如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。 图6-1 VC调试信息设置 6.5测试结果 打开人机接口设备演示程序。 (1)打开设备功能测试: 点击打开设备按钮,会出现如图6-2所示的提示信息。具体的枚举过程见2.2.3 USB总线枚举过程,及表6-1枚举数据的捕获。 图6-2 打开设备功能测试 (2)LCD显示功能测试: 在输入框输入欲显示在LCD上的字符,再点击LCD显示按钮,如图6-3所示,设备上的LCD液晶显示屏即会显示输入的字符。 图6-3 LCD显示功能测试 具体LCD传输数据用Bus Hound捕获如表6-3。其中CTL为控制传输,D0为数据输出。D0输出的第一个字节01为LCD显示命令,后面为31个字节为欲显示的字节。 表6-3 LCD传输数据捕获 传输类型 传输数据 描述 CTL 21 09 00 03 00 00 20 00 SET REPORT DO 01 0e 48 65 6c 6c 6f 20 44 61 76 69 64 21 21 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (3)键盘功能测试: 点击键盘输入功能,即可在开发板实现按键功能,并回传至人机接口设备。如下图6-3所示,显示框成功输出33 32 31 30 37 36。 图6-4 键盘功能测试 具体键盘传输数据用Bus Hound捕获如表6-4。其中CTL为控制传输,D0为数据输出,DI为数据输入。D0输出的第一个字节02为键盘命令,DI为设备传回的键值。 表6-4 键盘传输数据捕获 传输类型 传输数据 描述 CTL 21 09 00 03 00 00 20 00 SET REPORT DO 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 DI 06 31 30 31 32 33 34 35 DI 00 06 31 30 31 32 33 34 35 7 总结与展望 在本项目的开发过程中,本人深深的感悟到开发一个USB HID设备看起来容易,实则艰难。选择HID设备类,虽然省略了主机端驱动程序的开发,但是设备端定义为一个全速HID设备,需要深入了解USB 2.0协议,深入了解HID描述符的内涵。项目中的许多地方,比如键盘与LCD的同步处理,线程的响应也做得并不完善,还有待提高。虽然项目是结束了,但是感觉对USB协议的理解仍是九牛一毛,是远远不够的。在后续的工作中,还要加强学习。 2008年11月16日,随着USB3.0规范的发布,新一轮的接口技术将引领IT业接口技术的发展。USB接口技术脱胎换骨,USB3.0支持高达5.0Gbps的传输速率,并且保持了良好的向下兼容。十倍于USB2.0的传输速率和更高的节能效率,标志着USB向高速外设进军的又一里程碑,USB3.0毫无悬念的将带动USB接口技术走向更美好的明天。 参考文献 [1] 王云飞:《USB 系统研究》[M],清华大学工程物理系,2001,5 [2] 李英伟,王成儒,胡正平,《USB 2.0原理与工程开发》,国防工业出版社,2006 [3] 武安河,周利莉,《Windows设备驱动程序(VxD与WDM)开发实务》[M],电子工业出版社,2001 [4]范文庆,周彬彬,安靖,《精通Windows API:函数、接口、编程实例》[M],人民邮电出版社,2009 [5] 周立功,等, PDIUSBD12 USB固件编程与驱动程序[M],北京航空航天大学出版社,2003 [6]马斌,《单片机原理及应用》[M],人民邮电出版社,2009 [7]李建忠, 单片机原理及应用[M],西安电子科技大学出版社,2002 [8]珧建刚,魏安阳,邱淑范,《通用串行总线USB设备的驱动》[J],《电子技术应用》,2001年第5期,第14-16页 [9] 詹客团,侯国志,吕铁良等,《USB HID类设备开发》[J],《电测与仪表》,2004年第5期,第48-50页 [10] Walter Oney,《Programming the Microsoft Windows Driver Model》,Microsoft press,2000 [11]Compaq,Intel,Philips,Universal Serial Bus Specification Revision2.0,http://www.usb.org,2000 [12]Compaq,Intel,Philips,Device Class Definition for Human Interface Devices (HID),http://www.usb.org,2001 [13]ST2211 Integrated Microcontroller User’s Manual,2006 [14]HID Usage Tables,Version 1.11,2001 [15]ST7070 Dot Matrix LCD Controller/Driver,2008 附 录 附录一:上位机打开设备代码: void CHidSchoolDlg::OnOpenDev() { //定义一个GUID的结构体HidGuid来保存HID设备的接口类GUID。 GUID HidGuid; //定义一个DEVINFO的句柄hDevInfoSet来保存获取到的设备信息集合句柄。 HDEVINFO hDevInfoSet; //定义MemberIndex,表示当前搜索到第几个设备,0表示第一个设备。 DWORD MemberIndex; //DevInterfaceData,用来保存设备的驱动接口信息 SP_DEVICE_INTERFACE_DATA DevInterfaceData; //定义一个BOOL变量,保存函数调用是否返回成功 BOOL Result; //定义一个RequiredSize的变量,用来接收需要保存详细信息的缓冲长度。 DWORD RequiredSize; //定义一个指向设备详细信息的结构体指针。 PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetailData; //定义一个用来保存打开设备的句柄。 // HANDLE hDevHandle; //定义一个HIDD_ATTRIBUTES的结构体变量,保存设备的属性。 HIDD_ATTRIBUTES DevAttributes; //初始化设备未找到 MyDevFound=FALSE; //对DevInterfaceData结构体的cbSize初始化为结构体大小 DevInterfaceData.cbSize=sizeof(DevInterfaceData); //对DevAttributes结构体的Size初始化为结构体大小 DevAttributes.Size=sizeof(DevAttributes); //调用HidD_GetHidGuid函数获取HID设备的GUID,并保存在HidGuid中。 HidD_GetHidGuid(&HidGuid); //根据HidGuid来获取设备信息集合。其中Flags参数设置为 //DIGCF_DEVICEINTERFACE|DIGCF_PRESENT,前者表示使用的GUID为 //接口类GUID,后者表示只列举正在使用的设备,因为我们这里只 //查找已经连接上的设备。返回的句柄保存在hDevinfo中。注意设备 //信息集合在使用完毕后,要使用函数SetupDiDestroyDeviceInfoList //销毁,不然会造成内存泄漏。 hDevInfoSet=SetupDiGetClassDevs(&HidGuid, NULL, NULL, DIGCF_DEVICEINTERFACE|DIGCF_PRESENT); AddToInfOut("开始查找设备"); //然后对设备集合中每个设备进行列举,检查是否是我们要找的设备 //当找到我们指定的设备,或者设备已经查找完毕时,就退出查找。 //首先指向第一个设备,即将MemberIndex置为0。 MemberIndex=0; while(1) { //调用SetupDiEnumDeviceInterfaces在设备信息集合中获取编号为 //MemberIndex的设备信息。 Result=SetupDiEnumDeviceInterfaces(hDevInfoSet, NULL, &HidGuid, MemberIndex, &DevInterfaceData); //如果获取信息失败,则说明设备已经查找完毕,退出循环。 if(Result==FALSE) break; //将MemberIndex指向下一个设备 MemberIndex++; //如果获取信息成功,则继续获取该设备的详细信息。在获取设备 //详细信息时,需要先知道保存详细信息需要多大的缓冲区,这通过 //第一次调用函数SetupDiGetDeviceInterfaceDetail来获取。这时 //提供缓冲区和长度都为NULL的参数,并提供一个用来保存需要多大 //缓冲区的变量RequiredSize。 Result=SetupDiGetDeviceInterfaceDetail(hDevInfoSet, &DevInterfaceData, NULL, NULL, &RequiredSize, NULL); //然后,分配一个大小为RequiredSize缓冲区,用来保存设备详细信息。 pDevDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize); if(pDevDetailData==NULL) //如果内存不足,则直接返回。 { MessageBox("内存不足!"); SetupDiDestroyDeviceInfoList(hDevInfoSet); return; } //并设置pDevDetailData的cbSize为结构体的大小(注意只是结构体大小, //不包括后面缓冲区)。 pDevDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //然后再次调用SetupDiGetDeviceInterfaceDetail函数来获取设备的 //详细信息。这次调用设置使用的缓冲区以及缓冲区大小。 Result=SetupDiGetDeviceInterfaceDetail(hDevInfoSet, &DevInterfaceData, pDevDetailData, RequiredSize, NULL, NULL); //将设备路径复制出来,然后销毁刚刚申请的内存。 MyDevPathName=pDevDetailData->DevicePath; free(pDevDetailData); //如果调用失败,则查找下一个设备。 if(Result==FALSE) continue; //如果调用成功,则使用不带读写访问的CreateFile函数 //来获取设备的属性,包括VID、PID、版本号等。 //对于一些独占设备(例如USB键盘),使用读访问方式是无法打开的, //而使用不带读写访问的格式才可以打开这些设备,从而获取设备的属性。 hDevHandle=CreateFile(MyDevPathName, NULL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //如果打开成功,则获取设备属性。 if(hDevHandle!=INVALID_HANDLE_VALUE) { //获取设备的属性并保存在DevAttributes结构体中 Result=HidD_GetAttributes(hDevHandle, &DevAttributes); //关闭刚刚打开的设备 CloseHandle(hDevHandle); //获取失败,查找下一个 if(Result==FALSE) continue; //如果获取成功,则将属性中的VID、PID以及设备版本号与我们需要的 //进行比较,如果都一致的话,则说明它就是我们要找的设备。 if(DevAttributes.VendorID == HD_VID) //如果VID相等 if(DevAttributes.ProductID == HD_PID) //并且PID相等 { MyDevFound=TRUE; //设置设备已经找到 AddToInfOut("设备已经找到"); //那么就是我们要找的设备,分别使用读写方式打开之,并保存其句柄 //并且选择为异步访问方式。 hDevHandle=CreateFile(MyDevPathName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if(hDevHandle!=INVALID_HANDLE_VALUE)AddToInfOut("打开设备成功"); else AddToInfOut("打开设备失败"); DataInSending=FALSE; //可以发送数据 //手动触发事件,让读报告线程恢复运行。因为在这之前并没有调用 //读数据的函数,也就不会引起事件的产生,所以需要先手动触发一 //次事件,让读报告线程恢复运行。 SetEvent(ReadOverlapped.hEvent); break; } } //如果打开失败,则查找下一个设备 else continue; } //调用SetupDiDestroyDeviceInfoList函数销毁设备信息集合 SetupDiDestroyDeviceInfoList(hDevInfoSet); } LCD功能上位机代码: void CHidSchoolDlg::OnButtonLcd() { // TODO: Add your control notification handler code here CString InText; UCHAR sendLen = 0; if(hDevHandle == INVALID_HANDLE_VALUE) { MessageBox("请连接设备!"); return; } GetDlgItemText(IDC_EDIT_LCD,InText); //获取输入的文本 sendLen = InText.GetLength(); if((sendLen < 1) || (sendLen > 32)) { MessageBox("无数据或数据超过32字节!",NULL,MB_OK | MB_ICONSTOP); return; } if(hDevHandle != INVALID_HANDLE_VALUE) { char sendData[100]; strncpy(sendData, (LPCTSTR)InText, sendLen); memcpy(WriteReportBuffer+3, sendData, sendLen); WriteReportBuffer[0] = 0x00; WriteReportBuffer[1] = 0x01; //Display command WriteReportBuffer[2] = sendLen; if(HidD_SetFeature(hDevHandle, WriteReportBuffer, 0x21)) { AddToInfOut("LCD Will Display:", FALSE); AddToInfOut(InText, FALSE); } else { MessageBox("传输错误!",NULL,MB_OK | MB_ICONSTOP); return; } } } 附录二:LCD功能下位机代码: _Check_Press_Key: PHX GPIO_PAX_PIN $1F,INPUT,PULL_UP GPIO_PBX_PIN $F0,OUTPUT,LOW NOP NOP ;Waitting stably NOP NOP LDA 毕业论文 毕业论文答辩ppt模板下载毕业论文ppt模板下载毕业论文ppt下载关于药学专业毕业论文临床本科毕业论文下载 暂告收尾,这也意味着我在北京理工大学珠海学院的四年的学习生活即将结束。回首四年的大学生活,首先,我要感谢我的母校——北京理工大学珠海学院,自己一生最宝贵的时光能于这样的校园之中,能在众多学富五车、才华横溢的老师们的熏陶下度过,实是荣幸之极。感谢计算机学院的所有领导和老师,感谢嵌入式实验室的几位老师:吴方老师,王震老师,盛建强老师和陈东伟老师,以及网络的高树风老师,今天的成果离不开老师们辛勤的栽培。 在毕业设计的项目进行中,我最要感谢的是我的指导老师吴方院长,他渊博的知识,热情的教学方法,让我获益颇丰。感谢吴方老师对我毕业设计的大力支持,本项目能顺利完成离不开您的鼓励与指导! 在毕业设计进行中,我的同事张彦中不仅提供大量的项目学习资料,还一直加班加点的指导我,衷心感谢张彦中师父,在课题研究过程中始终给予我无私的帮助!他一丝不苟的作风是我学习、工作的榜样。 同时,我还要感谢实习单位乐毅软件科技有限公司提供的这次学习机会。 最后,感谢 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 评委会的老师们对本论文的悉心指点。 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作 者 签 名:       日  期:        ​​​​​​​​​​​​ 指导教师签名:        日  期:        使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:        日  期:        ​​​​​​​​​​​​ 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名: 日期: 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权      大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名: 日期: 年 月 日 导师签名: 日期: 年 月 日 指导教师评阅书 指导教师评价: 一、撰写(设计)过程 1、学生在论文(设计)过程中的治学态度、工作精神 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、学生掌握专业知识、技能的扎实程度 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生综合运用所学知识和专业技能分析和解决问题的能力 □ 优 □ 良 □ 中 □ 及格 □ 不及格 4、研究方法的科学性;技术线路的可行性;设计方案的合理性 □ 优 □ 良 □ 中 □ 及格 □ 不及格 5、完成毕业论文(设计)期间的出勤情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 指导教师: (签名) 单位: (盖章) 年 月 日 评阅教师评阅书 评阅教师评价: 一、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 评阅教师: (签名) 单位: (盖章) 年 月 日 教研室(或答辩小组)及教学系意见 教研室(或答辩小组)评价: 一、答辩过程 1、毕业论文(设计)的基本要点和见解的叙述情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、对答辩问题的反应、理解、表达情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生答辩过程中的精神状态 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 评定成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 教研室主任(或答辩小组组长): (签名) 年 月 日 教学系意见: 系主任: (签名) 年 月 日 学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下进行的研究工作所取得的成果。尽我所知,除文中已经特别注明引用的内容和致谢的地方外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式注明并表示感谢。本人完全意识到本声明的法律结果由本人承担。 学位论文作者(本人签名): 年 月 日 学位论文出版授权书 本人及导师完全同意《中国博士学位论文 全文 企业安全文化建设方案企业安全文化建设导则安全文明施工及保证措施创建安全文明校园实施方案创建安全文明工地监理工作情况 数据库出版章程》、《中国优秀硕士学位论文全文数据库出版章程》(以下简称“章程”),愿意将本人的学位论文提交“中国学术期刊(光盘版)电子杂志社”在《中国博士学位论文全文数据库》、《中国优秀硕士学位论文全文数据库》中全文发表和以电子、网络形式公开出版,并同意编入****《中国知识资源总库》,在《中国博硕士学位论文评价数据库》中使用和在互联网上传播,同意按“章程”规定享受相关权益。 论文密级: □公开 □保密(___年__月至__年__月)(保密的学位论文在解密后应遵守此协议) 作者签名:_______ 导师签名:_______ _______年_____月_____日 _______年_____月_____日 独 创 声 明 本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。 本声明的法律后果由本人承担。   作者签名: 二〇一〇年九月二十日   毕业设计(论文)使用授权声明 本人完全了解**学院关于收集、保存、使用毕业设计(论文)的规定。 本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。 (保密论文在解密后遵守此规定)   作者签名: 二〇一〇年九月二十日 致 谢 时间飞逝,大学的学习生活很快就要过去,在这四年的学习生活中,收获了很多,而这些成绩的取得是和一直关心帮助我的人分不开的。 首先非常感谢学校开设这个课题,为本人日后从事计算机方面的工作提供了经验,奠定了基础。本次毕业设计大概持续了半年,现在终于到结尾了。本次毕业设计是对我大学四年学习下来最好的检验。经过这次毕业设计,我的能力有了很大的提高,比如操作能力、分析问题的能力、合作精神、严谨的工作作风等方方面面都有很大的进步。这期间凝聚了很多人的心血,在此我表示由衷的感谢。没有他们的帮助,我将无法顺利完成这次设计。 首先,我要特别感谢我的知道***老师对我的悉心指导,在我的论文书写及设计过程中给了我大量的帮助和指导,为我理清了设计思路和操作方法,并对我所做的课题提出了有效的改进方案。***老师渊博的知识、严谨的作风和诲人不倦的态度给我留下了深刻的印象。从他身上,我学到了许多能受益终生的东西。再次对周巍老师表示衷心的感谢。 其次,我要感谢大学四年中所有的任课老师和辅导员在学习期间对我的严格要求,感谢他们对我学习上和生活上的帮助,使我了解了许多专业知识和为人的道理,能够在今后的生活道路上有继续奋斗的力量。 另外,我还要感谢大学四年和我一起走过的同学朋友对我的关心与支持,与他们一起学习、生活,让我在大学期间生活的很充实,给我留下了很多难忘的回忆。 最后,我要感谢我的父母对我的关系和理解,如果没有他们在我的学习生涯中的无私奉献和默默支持,我将无法顺利完成今天的学业。 四年的大学生活就快走入尾声,我们的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。 回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师四年来对我孜孜不倦的教诲,对我成长的关心和爱护。 学友情深,情同兄妹。四年的风风雨雨,我们一同走过,充满着关爱,给我留下了值得珍藏的最美好的记忆。 在我的十几年求学历程里,离不开父母的鼓励和支持,是他们辛勤的劳作,无私的付出,为我创造良好的学习条件,我才能顺利完成完成学业,感激他们一直以来对我的抚养与培育。 最后,我要特别感谢我的导师***老师、和研究生助教***老师。是他们在我毕业的最后关头给了我们巨大的帮助与鼓励,给了我很多解决问题的思路,在此表示衷心的感激。老师们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。在论文的撰写过程中老师们给予我很大的帮助,帮助解决了不少的难点,使得论文能够及时完成,这里一并表示真诚的感谢。 致 谢 这次论文的完成,不止是我自己的努力,同时也有老师的指导,同学的帮助,以及那些无私奉献的前辈,正所谓你知道的越多的时候你才发现你知道的越少,通过这次论文,我想我成长了很多,不只是磨练了我的知识厚度,也使我更加确定了我今后的目标:为今后的计算机事业奋斗。在此我要感谢我的指导老师——***老师,感谢您的指导,才让我有了今天这篇论文,您不仅是我的论文导师,也是我人生的导师,谢谢您!我还要感谢我的同学,四年的相处,虽然我未必记得住每分每秒,但是我记得每一个有你们的精彩瞬间,我相信通过大学的历练,我们都已经长大,变成一个有担当,有能力的新时代青年,感谢你们的陪伴,感谢有你们,这篇论文也有你们的功劳,我想毕业不是我们的相处的结束,它是我们更好相处的开头,祝福你们!我也要感谢父母,这是他们给我的,所有的一切;感谢母校,尽管您不以我为荣,但我一直会以我是一名农大人为荣。 通过这次毕业设计,我学习了很多新知识,也对很多以前的东西有了更深的记忆与理解。漫漫求学路,过程很快乐。我要感谢信息与管理科学学院的老师,我从他们那里学到了许多珍贵的知识和做人处事的道理,以及科学严谨的学术态度,令我受益良多。同时还要感谢学院给了我一个可以认真学习,天天向上的学习环境和机会。 即将结束*大学习生活,我感谢****大学提供了一次在**大接受教育的机会,感谢院校老师的无私教导。感谢各位老师审阅我的论文。 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作 者 签 名:       日  期:        ​​​​​​​​​​​​ 指导教师签名:        日  期:        使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:        日  期:        ​​​​​​​​​​​​ 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名: 日期: 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权      大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名: 日期: 年 月 日 导师签名: 日期: 年 月 日 独 创 声 明 本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。 本声明的法律后果由本人承担。   作者签名: 年 月 日   毕业设计(论文)使用授权声明 本人完全了解**学院关于收集、保存、使用毕业设计(论文)的规定。 本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。 (保密论文在解密后遵守此规定)   作者签名: 年 月 日 基本要求:写毕业论文主要目的是培养学生综合运用所学知识和技能,理论联系实际,独立分析,解决实际问题的能力,使学生得到从事本专业工作和进行相关的基本训练。毕业论文应反映出作者能够准确地掌握所学的专业基础知识,基本学会综合运用所学知识进行科学研究的方法,对所研究的题目有一定的心得体会,论文题目的范围不宜过宽,一般选择本学科某一重要问题的一个侧面。 毕业论文的基本教学要求是: 1、培养学生综合运用、巩固与扩展所学的基础理论和专业知识,培养学生独立分析、解决实际问题能力、培养学生处理数据和信息的能力。2、培养学生正确的理论联系实际的工作作风,严肃认真的科学态度。3、培养学生进行社会调查研究;文献资料收集、阅读和整理、使用;提出论点、综合论证、总结写作等基本技能。 毕业论文是毕业生总结性的独立作业,是学生运用在校学习的基本知识和基础理论,去分析、解决一两个实际问题的实践锻炼过程,也是学生在校学习期间学习成果的综合性总结,是整个教学活动中不可缺少的重要环节。撰写毕业论文对于培养学生初步的科学研究能力,提高其综合运用所学知识分析问题、解决问题能力有着重要意义。 毕业论文在进行编写的过程中,需要经过开题报告、论文编写、论文上交评定、论文答辩以及论文评分五个过程,其中开题报告是论文进行的最重要的一个过程,也是论文能否进行的一个重要指标。 撰写意义:1.撰写毕业论文是检验学生在校学习成果的重要措施,也是提高教学质量的重要环节。大学生在毕业前都必须完成毕业论文的撰写任务。申请学位必须提交相应的学位论文,经答辩通过后,方可取得学位。可以这么说,毕业论文是结束大学学习生活走向社会的一个中介和桥梁。毕业论文是大学生才华的第一次显露,是向祖国和人民所交的一份有份量的答卷,是投身社会主义现代化建设事业的报到书。一篇毕业论文虽然不能全面地反映出一个人的才华,也不一定能对社会直接带来巨大的效益,对专业产生开拓性的影响。但是,实践证明,撰写毕业论文是提高教学质量的重要环节,是保证出好人才的重要措施。 2.通过撰写毕业论文,提高写作水平是干部队伍“四化”建设的需要。党中央要求,为了适应现代化建设的需要,领导班子成员应当逐步实现“革命化、年轻化、知识化、专业化”。这个“四化”的要求,也包含了对干部写作能力和写作水平的要求。 3.提高大学生的写作水平是社会主义物质文明和精神文明建设的需要。在新的历史时期,无论是提高全族的科学文化水平,掌握现代科技知识和科学管理方法,还是培养社会主义新人,都要求我们的干部具有较高的写作能力。在经济建设中,作为领导人员和机关的办事人员,要写指示、通知、总结、调查报告等应用文;要写说明书、广告、解说词等说明文;还要写科学论文、经济评论等议论文。在当今信息社会中,信息对于加快经济发展速度,取得良好的经济效益发挥着愈来愈大的作用。写作是以语言文字为信号,是传达信息的方式。信息的来源、信息的收集、信息的储存、整理、传播等等都离不开写作。 论文种类:毕业论文是学术论文的一种形式,为了进一步探讨和掌握毕业论文的写作规律和特点,需要对毕业论文进行分类。由于毕业论文本身的内容和性质不同,研究领域、对象、方法、表现方式不同,因此,毕业论文就有不同的分类方法。 按内容性质和研究方法的不同可以把毕业论文分为理论性论文、实验性论文、描述性论文和设计性论文。后三种论文主要是理工科大学生可以选择的论文形式,这里不作介绍。文科大学生一般写的是理论性论文。理论性论文具体又可分成两种:一种是以纯粹的抽象理论为研究对象,研究方法是严密的理论推导和数学运算,有的也涉及实验与观测,用以验证论点的正确性。另一种是以对客观事物和现象的调查、考察所得观测资料以及有关文献资料数据为研究对象,研究方法是对有关资料进行分析、综合、概括、抽象,通过归纳、演绎、类比,提出某种新的理论和新的见解。 按议论的性质不同可以把毕业论文分为立论文和驳论文。立论性的毕业论文是指从正面阐述论证自己的观点和主张。一篇论文侧重于以立论为主,就属于立论性论文。立论文要求论点鲜明,论据充分,论证严密,以理和事实服人。驳论性毕业论文是指通过反驳别人的论点来树立自己的论点和主张。如果毕业论文侧重于以驳论为主,批驳某些错误的观点、见解、理论,就属于驳论性毕业论文。驳论文除按立论文对论点、论据、论证的要求以外,还要求针锋相对,据理力争。 按研究问题的大小不同可以把毕业论文分为宏观论文和微观论文。凡届国家全局性、带有普遍性并对局部工作有一定指导意义的论文,称为宏观论文。它研究的面比较宽广,具有较大范围的影响。反之,研究局部性、具体问题的论文,是微观论文。它对具体工作有指导意义,影响的面窄一些。 另外还有一种综合型的分类方法,即把毕业论文分为专题型、论辩型、综述型和综合型四大类: 1.专题型论文。这是分析前人研究成果的基础上,以直接论述的形式发表见解,从正面提出某学科中某一学术问题的一种论文。如本书第十二章例文中的《浅析领导者突出工作重点的方法与艺术》一文,从正面论述了突出重点的工作方法的意义、方法和原则,它表明了作者对突出工作重点方法的肯定和理解。2.论辩型论文。这是针对他人在某学科中某一学术问题的见解,凭借充分的论据,着重揭露其不足或错误之处,通过论辩形式来发表见解的一种论文。3.综述型论文。这是在归纳、总结前人或今人对某学科中某一学术问题已有研究成果的基础上,加以介绍或评论,从而发表自己见解的一种论文。4.综合型论文。这是一种将综述型和论辩型两种形式有机结合起来写成的一种论文。如《关于中国民族关系史上的几个问题》一文既介绍了研究民族关系史的现状,又提出了几个值得研究的问题。因此,它是一篇综合型的论文。 写作步骤:毕业论文是高等教育自学考试本科专业应考者完成本科阶段学业的最后一个环节,它是应考者的 总结 性独立作业,目的在于总结学习专业的成果,培养综合运用所学知识解决实际 问题 的能力。从文体而言,它也是对某一专业领域的现实问题或 理论 问题进行 科学 研究 探索的具有一定意义的论说文。完成毕业论文的撰写可以分两个步骤,即选择课题和研究课题。 首先是选择课题。选题是论文撰写成败的关键。因为,选题是毕业论文撰写的第一步,它实际上就是确定“写什么”的问题,亦即确定科学研究的方向。如果“写什么”不明确,“怎么写”就无从谈起。 教育部自学考试办公室有关对毕业论文选题的途径和要求是“为鼓励理论与工作实践结合,应考者可结合本单位或本人从事的工作提出论文题目,报主考学校审查同意后确立。也可由主考学校公布论文题目,由应考者选择。毕业论文的总体要求应与普通全日制高等学校相一致,做到通过论文写作和答辩考核,检验应考者综合运用专业知识的能力”。但不管考生是自己任意选择课题,还是在主考院校公布的指定课题中选择课题,都要坚持选择有科学价值和现实意义的、切实可行的课题。选好课题是毕业论文成功的一半。 第一、要坚持选择有科学价值和现实意义的课题。科学研究的目的是为了更好地认识世界、改造世界,以推动社会的不断进步和发展 。因此,毕业论文的选题,必须紧密结合社会主义物质文明和精神文明建设的需要,以促进科学事业发展和解决现实存在问题作为出发点和落脚点。选题要符合科学研究的正确方向,要具有新颖性,有创新、有理论价值和现实的指导意义或推动作用,一项毫无意义的研究,即使花很大的精力,表达再完善,也将没有丝毫价值。具体地说,考生可从以下三个方面来选题。首先,要从现实的弊端中选题,学习了专业知识,不能仅停留在书本上和理论上,还要下一番功夫,理论联系实际,用已掌握的专业知识,去寻找和解决工作实践中急待解决的问题。其次,要从寻找科学研究的空白处和边缘领域中选题,科学研究。还有许多没有被开垦的处女地,还有许多缺陷和空白,这些都需要填补。应考者应有独特的眼光和超前的意识去思索,去发现,去研究。最后,要从寻找前人研究的不足处和错误处选题,在前人已提出来的研究课题中,许多虽已有初步的研究成果,但随着社会的不断发展,还有待于丰富、完整和发展,这种补充性或纠正性的研究课题,也是有科学价值和现实指导意义的。 第二、要根据自己的能力选择切实可行的课题。毕业论文的写作是一种创造性劳动,不但要有考生个人的见解和主张,同时还需要具备一定的客观条件。由于考生个人的主观、客观条件都是各不相同的,因此在选题时,还应结合自己的特长、兴趣及所具备的客观条件来选题。具体地说,考生可从以下三个方面来综合考虑。首先,要有充足的资料来源。“巧妇难为无米之炊”,在缺少资料的情况下,是很难写出高质量的论文的。选择一个具有丰富资料来源的课题,对课题深入研究与开展很有帮助。其次,要有浓厚的研究兴趣,选择自己感兴趣的课题,可以激发自己研究的热情,调动自己的主动性和积极性,能够以专心、细心、恒心和耐心的积极心态去完成。最后,要能结合发挥自己的业务专长,每个考生无论能力水平高低,工作岗位如何,都有自己的业务专长,选择那些能结合自己工作、发挥自己业务专长的课题,对顺利完成课题的研究大有益处。 致 谢 这次论文的完成,不止是我自己的努力,同时也有老师的指导,同学的帮助,以及那些无私奉献的前辈,正所谓你知道的越多的时候你才发现你知道的越少,通过这次论文,我想我成长了很多,不只是磨练了我的知识厚度,也使我更加确定了我今后的目标:为今后的计算机事业奋斗。在此我要感谢我的指导老师——***老师,感谢您的指导,才让我有了今天这篇论文,您不仅是我的论文导师,也是我人生的导师,谢谢您!我还要感谢我的同学,四年的相处,虽然我未必记得住每分每秒,但是我记得每一个有你们的精彩瞬间,我相信通过大学的历练,我们都已经长大,变成一个有担当,有能力的新时代青年,感谢你们的陪伴,感谢有你们,这篇论文也有你们的功劳,我想毕业不是我们的相处的结束,它是我们更好相处的开头,祝福你们!我也要感谢父母,这是他们给我的,所有的一切;感谢母校,尽管您不以我为荣,但我一直会以我是一名农大人为荣。 通过这次毕业设计,我学习了很多新知识,也对很多以前的东西有了更深的记忆与理解。漫漫求学路,过程很快乐。我要感谢信息与管理科学学院的老师,我从他们那里学到了许多珍贵的知识和做人处事的道理,以及科学严谨的学术态度,令我受益良多。同时还要感谢学院给了我一个可以认真学习,天天向上的学习环境和机会。 即将结束*大学习生活,我感谢****大学提供了一次在**大接受教育的机会,感谢院校老师的无私教导。感谢各位老师审阅我的论文。 PAGE 3 _1335538009.vsd � � � 开始 设备复位,系统初始化� 发送USB中断� 是否是EP0中断� 是否有数据发送 数据存入缓冲区等待USB中断� 是否有其它USB中断?� 清系统变量� USB线是否连接� 结束� EP0中断服务程序� Y N Y Y N N Y N N Y _1335539237.vsd � � � 开始� 使用HidD_GetHidGuid 得到HID类GUID� 结束� 错误号是ERROR_NO_MORE_ITEMS 使用SetupDiEnumInterfaceDevice 枚举设备接口� 使用SetupDiEnumDeviceInterfaces 取得设备接口详细信息� 成功?� 是否需要操作设备?� N 使用SetupDiGetClassDev 得到HID设备类信息� 利用上一步取得的设备路径信息 使用CreateFile打开设备� 使用Hid_GetAttributes 取得VID、PID等信息� 使用GetLastError() Y N _1335198470.vsd � Power On Delay 41ms, After Vcc > 4.5V� Function set� Delay 38us� Display ON/OFF control� Delay 37us Display clear Delay 1.53ms� Entry mode set Initialization end� _1335536937.vsd � � � 开始 行X置为低电平,并开始扫描各列Y� 是否有键按下� 列Y是否为高电平 列值Y增一� 列值为6? 行值X增一� 行值为5?� 键值为0� 结束� Y Y Y 记录键值 N N N N _1335012213.vsd � � � 开始 应用程序初始化 打开目标HID设备� 启动USB设备通信� LCD事件或键盘事件 LCD显示或获取键盘值 Y Y N N 结束
本文档为【基于HID的人机接口设备的设计及应用本科生毕业设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥11.9 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
不系舟红枫
从教近30年,经验丰富,教学水平较高
格式:doc
大小:1MB
软件:Word
页数:0
分类:工学
上传时间:2019-01-23
浏览量:5