毕业设计论文基于嵌入式系统的PC键盘与鼠标交互控制模拟研究

上传人:仙*** 文档编号:67503417 上传时间:2022-03-31 格式:DOC 页数:57 大小:1.34MB
收藏 版权申诉 举报 下载
毕业设计论文基于嵌入式系统的PC键盘与鼠标交互控制模拟研究_第1页
第1页 / 共57页
毕业设计论文基于嵌入式系统的PC键盘与鼠标交互控制模拟研究_第2页
第2页 / 共57页
毕业设计论文基于嵌入式系统的PC键盘与鼠标交互控制模拟研究_第3页
第3页 / 共57页
资源描述:

《毕业设计论文基于嵌入式系统的PC键盘与鼠标交互控制模拟研究》由会员分享,可在线阅读,更多相关《毕业设计论文基于嵌入式系统的PC键盘与鼠标交互控制模拟研究(57页珍藏版)》请在装配图网上搜索。

1、基于嵌入式系统的PC键盘与鼠标交互控制模拟研究 2006级计算机科学与技术*班 * 指导教师 张三 【摘要】随着信息技术发展,各类应用软件不断丰富。已有的商用软件的高效率切入成为一个十分棘手的问题。如一款基于PC的性能完备的操纵训练软件,常以键盘与鼠标作为模拟输入设备,但这与真实的操作方式大相径庭,若能采用嵌入式系统开发一款操纵方式更加人性化、可再现原有键盘与鼠标控制功能的软硬结合的模拟系统,将使原有商用软件应用功能得到极大升华。随着硬件技术和自动化技术的不断发展,基于嵌入式技术各种系统模拟技术已经相当成熟。本系统是基于ARM嵌入式系统以及PC系统,结合所学计算机专业课程知识点开发设计一个基于

2、嵌入式系统的PC键盘与鼠标交互控制模拟系统。【关键字】键盘鼠标模拟;ARM嵌入式系统;PC系统;交互控制模拟; VC+Simulation for Interactive Contrals of PC Keyboard and Mouse Based on Embedded System Zhang Sand【Abstract】With the development of information technology,the kinds of applications software are greatly enriched。So communicating efficiencily wi

3、th a commercial software has been a very difficult problem。 Such as a complete PC-based manipulation -training software, its input device are always keyboard and mouse ,but there are much difference with the real input ways。So if we can develop a analog system that have a more Human-based and conven

4、ient input ways and can present the function of Keyboard and Mouse perfectly,the function of the software will be improved greatly。 As the hardware technology and automation technology continues to evolve, various systems based on embedded technology is already quite mature analog technology 。 【Key

5、words】 Keyboard and Mouse Simulation; ARM Embedded System; PC System ;Simulation of Interactive Control;VC+目录1绪论41.1开发背景介绍41.2 系统主要实现目标41.3 论文结构概述52开发环境和开发工具简介52.1 Microsoft Visual c+ 6.0项目概述 :52.2 C+语言简介52.2.1 C+语言特性52.2.2 WINAPI编程特性62.3 ADT概述:72.3.1 ADT嵌入式系统开发环境概述72.3.2 ADT与ARM嵌入式系统及PC系统的连接82.3.3

6、JX44B0-2嵌入式系统实验平台概绍83 程序结构、思想和相关技术介绍83.1 PC端软件的键盘与鼠标事件的仿真实现8311 PC端软件功能概绍83.1.2 键盘事件的模拟仿真83.1.3 鼠标事件的模拟仿真103.1.4多线程技术的引入133.2 ARM嵌入式系统端程序的设计与实现143.2.1 ARM端程序功能概绍143.2.2 异部串行通信的实现143.2.3 S3C44B0异步串行口控制器及相关寄存器163.2.4 键盘输入与IO163.2 PC端与ARM嵌入式端的串行通讯实现173.2.1 端与端串口通讯概绍173.2.2串口通讯工作方式173.2.1 串口数据接收的VC实现184

7、系统需求分析204.1 系统角色及其功能分析204.2 系统主要功能详细描述204.3 系统功能模块设计205 总体设计及实现215.1 总体模块设计215.2 各子系统模块总体设计235.2.1 JX44BO-2嵌入式系统端设计235.2.2 PC系统端程序设计256 系统详细设计276.1 PC端系统的具体实现与程序编写276.1.1 鼠标事件模拟的实现276.1.2 键盘事件模拟的实现306.1.3 多线程技术的实现326.1.4串口数据接收程序的VC实现356.2 ARM嵌入式系统端的具体实现与程序编写416.2.1串口通讯的实现416.2.2 键盘扫描功能的实现467 结束语488致

8、谢489 参考文献49附录1 PC端程序清单50附录2 ARM嵌入式系统端程序清单561 绪论1.1开发背景介绍在Windows大行其道的今天,windows界面程序受到广大用户的欢这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制。有时,对于繁杂的,或重复性的输入操作,我们能否通过编制程序来代替手工输入,而用程序来模拟键盘及鼠标的输入呢?答案是肯定的。本系统就是基于ARM嵌入式系统以及PC系统的 PC键盘与鼠标交互控制模拟系统。这一研究不仅可解决已有操纵训练系统的直观输入问题,而且还可能更大限度的发挥已有软件面向个性化应用的极大效率,具有很大的现实意义。12 系统主要实现目标主要实现目标:

9、首先要求完成PC端软件的键盘与鼠标事件仿真。PC端软件的键盘与鼠标事件仿真主要通过以下两个WINDOWS API 函数来实现:模拟键盘用Keybd_event这个api函数,模拟鼠标按键用mouse_event函数。编程语言选用VC+语言。并增加增加异步通信功能可通过WINDOWS下的异步调用来实现。然后,在嵌入式系统端完成D/A控制与模拟量,开关量控制,并开发实时异步通信功能。编程调试环境为ARM7嵌入式系统。最后,实现PC端与嵌入式系统端整体连接并调试,通信采用串行通讯方式。13 论文结构概述 在此次毕业论文中,首先对开发中所有到的相关技术进行了简单介绍:包括ADT1000体系结构和安装,

10、以及开发环境的配置;VC+语言的特征和他的应用前景;WINDOWS API的编程的工作原理和他的优点;ARM嵌入式编程的技术原理;程序的整体框架和工作原理。然后是对需求分析和详细设计 ,以及对本人所作模块的展示和部分实现代码。2 开发环境和开发工具简介21 Microsoft Visual c+ 6.0项目概述 : Visual C+ 6.0是微软公司推出的开发Win32应用程序,面向Windows95/98/2000/XP/NT操作系统的、面向对象的可视化集成工具。它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C 类层次结构,其中封装了大量的类及其函数,很多Windows程序

11、所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。 本项目中主要用到的是WINDOWS API编程的WindowsSDK(软件开发工具)。22 C+语言简介221 C+语言特性C语言系列的编程语言是当今非常流行的程序设计语言,它是由Dennis Richie在贝尔实验室研制开发的一个具有通用性的结构化程序设计语言,它融汇了高效,灵活等设计思想,具有较高的可移植性。 C语言的另一个重要特点是,比起其他编程语言来

12、,C语言的使用非常灵活。比如在使用典型的结构化语言pascal时,必须要实现在指定的区域声明变量或函数,然后在另一指定位置实现函数等。又比如,使用QBASIC语言,需要指定每行语句的行号,程序将按代码的行号依次执行。C语言在变量声明、函数定语言的组织、算法设计等方面并没有过于严格的限制。在基本语法特点方面,C+语言保持与C语言兼并,二者没有本质上的差别,大多数使用C语言编写的代码可以在C+语言中直接使用。这也是C+语言很快普及的一个重要原因。 C+语言与C语言的主要区别是编程思想上的更新,即编码由面向过程变为面向对象,基于此,C+语言引入了类与对象机制,包括类的定于,类的继承与派生,类的多态性

13、等。 在类定义方面,C+语言一方面自定义结构类型进行扩充,另一方面也支持新的类构造。 数据封装和隐藏是与类的定义紧密相关,并且在C+语言中经常碰到的现象,也是C+语言中的一大特点。数据的封装和隐藏使重要的内部数据得到保护。222 WINAPI编程特性视窗操作系统应用程序接口(Windows API),有非正式的简称法为WinAPI,是微软对于Windows操作系统中可用的内核应用程序编程接口的称法。它设计为由C/C+程序调用,而且它也是应用软件与Windows系统最直接的交互方式。而大多数驱动程序所需要的对Windows系统的更底层次访问接口,由所用版本的Windows的Native API来

14、提供接口。 Windows有一个软件开发包(SDK, software development kit)提供相应的文档和工具,以使程序员开发使用Windows API的软件和利用Windows技术。Windows API总会为程序员提供大量的构建不同Windows的底层结构,这有助于为Windows程序员开发应用程序提供大量的灵活性和功能。但是,它同样使Windows applications要负责处理大量底层且有时是繁琐的与图形用户界面(GUI)相关的操作。WINDOWS API应用程序框架如下图所示: 图1 WINDOWS API应用程序框架 Windows API所提供的功能可以归为七类

15、: 基础服务(Base Services)5,提供对Windows系统可用的基础资源的访问接口。比如象:文件系统(file system)、外部设备(device)、, 进程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)。这些功能接口位于,16位Windows下的kernel。exe、krnl286。exe或krnl386。exe系统文件中;以及32位Windows下的 kernel32。dll和advapi32。dll中。 图形设备接口(GDI)6,提供功能为:输出图形内容到显示器、打印机以及其他外部输

16、出设备。它位于16位Windows下的gdi。exe;以及32位Windows下的gdi32。dll。 图形化用户界面(GUI)7,提供的功能有创建和管理屏幕和大多数基本控件(control),比如按钮和滚动条。接收鼠标和键盘输入,以及其他与GUI有关的功能。这些调用接口位于:16位Windows下的user。exe, 以及32位Windows下的user32。dll。从Windows XP版本之后, 基本控件和通用对话框控件(Common Control Library)的调用接口放在comctl32。dll中。 通用对话框链接库(Common Dialog Box Library)8,为应

17、用程序提供标准对话框,比如打开/保存文件对话框、颜色对画框和字体对话框等等。这个链接库位于:16位Windows下的commdlg。dll中,以及32位Windows下comdlg32。dll中。它被归类为User Interface API之下。 通用控件链接库(Common Control Library)9,为应用程序提供接口来访问操作系统提供的一些高级控件。比如像:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)。这个链接库位于:16位Windows下的commctrl。dll中,以及32位Windows下comctl32。

18、dll中。 它被归类为User Interface API之下。 Windows外壳(Windows Shell)1011,作为Windows API的组成部分,不仅允许应用程序访问操作系统shell提供的功能,还对之有所改进和增强。它位于16位Windows下的shell。dll中,以及32位Windows下的shell32。dll中(Windows 95则在 shlwapi。dll中)。 它被归类为User Interface API之下。 网络服务(Network Services)12,为访问操作系统提供的多种网络 功能提供接口。它包括NetBIOS、Winsock、NetDDE及RP

19、C等。 23 ADT概述:231 ADT嵌入式系统开发环境概述ADT(ARM Development tools)嵌入式系统开发环境是由武汉创维特信息技术有限公司开发的具有自主知识产权的应用于嵌入式软件开发的集成软,硬件开发平台。它为基于ARM核的嵌入式应用提供了一整套完备的开发方案,包括程序编辑,工程管理和设置,程序调试等。ADT嵌入式开发环境由ADT Emulator for ARM和ADT IDE for ARM组成。本设计主要用到ADT IDE for ARM来完成。 ADT IDE forARM为用户提供高效明晰的图形化嵌入式软件开发环境,包括一套完备的面向嵌入式系统开发和调试工具:

20、集源码编辑器,工程管理器,工程编译器,集成调试环境,ADT Emulatorfor调试接口等。其界面同icrosoftisualtudio环境相似,用户可以在for集成开发环境中创建工程,打开工医嘱,建立打开和编译文件,编译,连接,设置,运行,调试嵌入式应用程序。232 ADT与ARM嵌入式系统及PC系统的连接连续图如下所示: 图2 ADT与PC系统及嵌入式系统连接图2.3.3 JX44B0-2嵌入式系统实验平台概绍JX44B0-1B是一购入式系统教学系统采用统一的豪华实验箱包装,除ADT1000仿真器外,所有配件均放置于实验箱之内,所包含配件如下: 1、JX44B0-1B主板一块; 2、AD

21、T1000仿真器一套(为可选配置); 3、320 X 240 256色彩色LCD显示器一块(带触摸屏); 4、4 X 4键盘一套; 5、USB连接电缆一条; 6、PC并口延长电缆一条; 7、RS-232串口通讯线一条; 8、直连网线一根;9、软件光盘一张; 10、实验指导书一本;3 程序结构、思想和相关技术介绍31 PC端软件的键盘与鼠标事件的仿真实现311 PC端软件功能概绍PC端的软件设计要求实现对键盘事件的按键动作(包括单键按下及组合键按下)和鼠标事件(包括移动光标位置,鼠标左右键的单击,双击等)的模拟仿真。并且在程序中要增加异步通信功能,并且引入多线程技术,使得程序具有更好和响应性和高

22、效率。312 键盘事件的模拟仿真我们来先了解一下windows中响应键盘事件的机制。当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。键盘上的所有按键都有一个编码,称作键盘扫描码。当按下一个键时,这个键的扫描码就被传给系统。扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。无论什么键盘,同一个按键的虚拟码总是相同的,这

23、样程序就可以识别了。简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41。当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。掌握了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。有多种方法可以实现键盘模拟,我们就介绍几种比较典型有:(1)局部级模拟: -PostMessageA -SendMessageA -MapVirtualKeyA 从上面的流程可以看出,键盘事件是最终被送到活动窗口,

24、然后才引起目标程序响应的。所以局部级模拟方法就是利用PostMessageA,SendMessageA,MapVirtualKeyA这三个API函数相互配合,直接伪造一个键盘消息发给目标程序。由于本设计没用这种方法,故不做深入探讨。(2)驱动级模拟: 驱动级模拟直接读写键盘的硬件端口,这种直接读写键盘端口的方法来模拟硬件事件的方法绕过了windows的消息机制,而直接与键盘驱动程序打交道,效率提高了很多。在此因本设计没涉及,故不深入讨论。(3)全局级模拟: -keybd_event -SendInput -SetWindowsHookExA 在全局事件中,键盘事件不是直接送到活动窗口,而是送给

25、了操作系统,模拟全局键盘息常用API函数keybd_event来实现。下面具体讨论全局级模拟: 有些程序(特别是一些游戏)出于某些原因,会禁止用户对它使用模拟按键程序,或者能够检查出收到的键盘消息与真实的按键和模拟的按键消息总是有一些小差别,从这些小差别上,目标程序就能判断出:这是假的!是伪造的!因此,如果用PostMessage发送局部消息模拟按键不成功的话,你可以试一试全局级的键盘消息。模拟全局键盘消息常见的可以有以下一些方法:(1) 用API函数keybd_event,这个函数可以用来模拟一个键盘事件,它的声明为:VOID keybd_event(BYTE bVk,BYTE bScan,

26、DWORD dwFlags,DWORD dwExtralnfo); 参数说明: bVk:定义一个虚拟键码。键码值必须在1254之间。 bScan:定义该键的硬件扫描码。 dwFlags:定义函数操作的名个方面的一个标志位集。应用程序可使用如下一些预定义常数的组合设置标志位。 KEYEVENTF_EXETENDEDKEY:若指定该值,则扫描码前一个值为OXEO(224)的前缀字节。KEYEVENTF_KEYUP:若指定该值,该键将被释放;若未指定该值,该键交被接下。dwExtralnfo:定义与击键相关的附加的32位值。 (2) 返回值:该函数无返回值。(3) 举例说明,比如要模拟按下A键,可以

27、这样:Const KEYEVENTF_KEYUP = &H2keybd_event( VK_A, 0, 0, 0 );/ 按下A键keybd_event( VK_A, 0, KEYEVENTF_KEYUP, 0 ); / 释放A键注意有时候按键的速度不要太快,否则会出问题,可以用API函数Sleep来进行延时。那么如果要模拟按下功能键怎么做呢?比如要按下Ctrl+C实现拷贝这个功能,可以这样:keybd_event (VK_Ctrl, 0, 0, 0 ); / 按下Ctrl键keybd_event (VK_C, 0, 0, 0 ) ; / 按下C键Sleep (500 ) ; /延时500毫秒

28、keybd_event (VK_C, 0, KEYEVENTF_KEYUP, 0 ); / 释放C键keybd_event (VK_Ctrl, 0, KEYEVENTF_KEYUP, 0 ) ; / 释放Ctrl键尽管keybd_event传递一个与OEM相关的硬件扫描码给系统,但应用程序不能用此扫描码。系统在内部将扫描码转换成虚拟键码,并且在传送给应用程序前清除键码的UP/down位。应用程序可以摸拟PRINTSCREEN键的按下来获得一个屏幕快照,并把它存放到剪切板中。若要做到这一点,则要将keybd_event的bVk参数置为VK_SNAPSHOT,bScan参数置为0(用以获得全屏快照

29、)或hScan置为1(仅获得活动窗口的快照)。Windows CE:WindowsCE支持dwFlags参数附加的标志位。即使用KEYEVENTF_SILENT标志模拟击键,而不产生敲击的声音。Windows CE不支持KEYEVENTF_EXTENDEDKEY标志。313 鼠标事件的模拟仿真鼠标事件的模拟主要由以下三个函数来实现:(1)mouse_event函数 函数功能:该函数综合鼠标击键和鼠标动作。 函数原型: VOID mouse_event( DWORD dwFlags, / motion and click options DWORD dx, / horizontal positi

30、on or change DWORD dy, / vertical position or change DWORD dwData, / wheel movement ULONG_PTR dwExtraInfo / application-defined information ); 参数: dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。此参数里的各位可以是下列值的任何合理组合: MOUSEEVENTF_ABSOLUTE:表明参数dX,dy含有规范化的绝对坐标。如果不设置此位,参数含有相对数据:相对于上次位置的改动位置。此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似

31、于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分。 MOUSEEVENTF_MOVE:表明发生移动。 MOUSEEVENTF_LEFTDOWN:表明接按下鼠标左键。 MOUSEEVENTF_LEFTUP:表明松开鼠标左键。 MOUSEEVENTF_RIGHTDOWN:表明按下鼠标右键。 MOUSEEVENTF_RIGHTUP:表明松开鼠标右键。 MOUSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。 MOUSEEVENTF_MIDDLEUP:表明松开鼠标中键。 MOUSEEVENTF_WHEEL:在Windows NT中如果鼠标有一个轮,表明鼠标轮被移动。移动的

32、数量由dwData给出。 dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。 dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的mickeys数。 dwData:如果dwFlags为MOUSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠

33、标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。 如果dwFlagsS不是MOUSEEVENTF_WHEEL,则dWData应为零。 dwExtralnfo:指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessgeExtraInfo来获得此附加信息。 返回值:无。 备注:如果鼠标被移动,用设置MOUSEEVENTF_MOVE来表明,dX和dy保留移动的信息。给出的信息是绝对或相对整数值。 如果指定了MOUSEEVENTF_ABSOLUTE值,则dX和dy含有标准化的绝对坐标,其值在0到65535之间。事件程序将此坐

34、标映射到显示表面。坐标(0,0)映射到显示表面的左上角,(65535,65535)映射到右下角。 如果没指定MOUSEEVENTF_ABSOLUTE,dX和dy表示相对于上次鼠标事件产生的位置(即上次报告的位置)的移动。正值表示鼠标向右(或下)移动;负值表示鼠标向左(或上)移动。 鼠标的相对移动服从鼠标速度和加速度等级的设置,一个最终用户用鼠标控制面板应用程序来设置这些值,应用程序用函数SystemParameterslnfo来取得和设置这些值。 在应用加速时系统对指定相对鼠标移动提供了两个测试。如果指定的沿X轴y轴的距离比第一个鼠标阈值大,并且鼠标的加速等级非零,则操作系统将距离加倍。如果指

35、定的沿X轴或y轴的距离比第二个鼠标阈值大,并且鼠标的加速等级为2,则操作系统将从第一个阈测试得来的距离加倍。这样就允许操作系统将指定鼠标沿X轴或y轴的相对位移加到4倍。 一旦应用了加速,系统用期望的鼠标速度换算合成的值。鼠标速度的范围是从1(最慢)到20(最快),并代表基于鼠标移动的距离指示符移动的数量。缺省值是10,表示对鼠标的移动设有附加的修改。 函数mouse_event需要用的应用程序用来合成鼠标事件。也被应用程序用来取得鼠标位置和鼠标按键状态之外的鼠标信息。例如,如果输入板制造商想将基于画笔的信息传给自己的应用程序,可以写一个直接与输入板硬件通信的动态键接库(DLL),获得附加的信息

36、,并保存到一个队列中。DLL然后调用 mouse_event,用标准按键和x/y位置数据,并在参数dwExtralnfo设置排列的附加信息的指针或索引。当应用程序需要附加信息时,调用 DLL(连同存贮在dwEXtralnfo中的指针或索引),则DLL返回附加信息。(2)GetCursorPos函数函数功能:该函数检取光标的位置,以屏幕坐标表示。 函数原型:BOOL GetCursorPos(LPPOlNT IpPoint); 参数: IpPint:POINT结构指针,该结构接收光标的屏幕坐标。 使用时要先定义一个数据结构: Public Type POINTAPI x As Long y As

37、 Long End Type 例如: dim biao as POINTAPI GetCursorPos biao 那么biao。x用来存放当前光标的x轴坐标,biao。y用来存放当前y轴的坐标。 返回值:如果成功,返回值非零;如果失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。 备注:。光标的位置通常以屏幕坐标的形式给出,它并不受包含该光标的窗口的映射模式的影响。该调用过程必须具有对窗口站的WINSTA_READATTRIBUTES访问权限。此函数为api函数,调用时要函数声明:Public Declare Function GetCursorPos Lib us

38、er32 (lpPoint As POINTAPI) As Long。(3)SetCursorPos函数函数功能:该函数把光标移到屏幕的指定位置。如果新位置不在由 ClipCursor函数设置的屏幕矩形区域之内,则系统自动调整坐标,使得光标在矩形之内。 函数原型:BOOL SetCursorPos(int X,int Y); 参数: X:指定光标的新的X坐标,以屏幕坐标表示。 Y:指定光标的新的Y坐标,以屏幕坐标表示。 返回值:如果成功,返回非零值;如果失败,返回值是零,若想获得更多错误信息,请调用GetLastError函数。 备注:该光标是共享资源,仅当该光标在一个窗口的客户区域内时它才能

39、移动该光标。314多线程技术的引入 在以前只有进程的操作系统中,进程是处理器调用的对象,但是多个进程并发时,进程切换带来的开销所占的比例越来越大,而且进程之间的通信效率也大大受到限制,因此就引入了多线程技术,此时线程成了处理器处理的对象,大大改善了处理器的效率,并减少了开发并行程序时的空间和时间开销。 所以,在本设计的PC端程序中引入多线程是有必要的,本线程次设计中主要用到两个线程,一个工作线程,主要用来处理数据,对键盘鼠标事件进行模拟,另一个线程主要用于接收串口数据。在两个线程的相互配合下,实现了PC端程序的异步通信,大大提高了程序和效率和响应速度。 多线程程序的一般框架如下: 图3 多线程

40、应用程序框架线程函数的输入一个LPVOID型的参数,可以是一个DWORD型的整数,也可以是一个指向一个缓冲区的指针, 返回一个DWORD型的值。象WinMain函数一样,这个函数并不由操作系统调用, 操作系统调用包含在KERNEL32。DLL中的非C运行时的一个内部函数,如StartOfThread,然后由StartOfThread函数建立起一个异常处理框架后,调用我们的函数。一个进程的主线程是由操作系统自动生成,如果你要让一个主线程创建额外的线程,你可以调用来CreateThread完成。CreateThread定义如下: HANDLE CreateThread(LPSECURITY_ATT

41、RIBUTES lpsa,DWORDcbstack,LPTHREAD_START_ROUTINElpStartAddr, LPVOID lpvThreadParm,DWORDfdwCreate,LPDWORDlpIDThread);其中lpsa参数为一个指向SECURITY_ATTRIBUTES结构的指针。如果想让对象为缺省安全属性的话,可以传一个NULL,如果想让任一个子进程都可继承一个该线程对象句柄,必须指定一个SECURITY_ATTRIBUTES结构,其中bInheritHandle成员初始化为TRUE。参数cbstack表示线程为自己所用堆栈分配的地址空间大小,0表示采用系统缺省值。

42、参数lpStartAddr为新线程开始执行时所在函数的地址,即为线程函数。lpvThreadParm为传入线程函数的参数,fdwCreate参数指定控制线程创建的附加标志,可以取两种值。如果该参数为0,线程就会立即开始执行,如果该参数为CREATE_SUSPENDED,则系统产生线程后,初始化CPU,登记CONTEXT结构的成员,准备好执行该线程函数中的第一条指令,但并不马上执行,而是挂起该线程。最后一个参数lpIDThread 是一个DWORD类型地址,返回赋给该新线程的ID值。3.2 ARM嵌入式系统端程序的设计与实现3.2.1 ARM端程序功能概绍在ARM端实现用查询方式对串口数据的收发

43、功能。收是指接收PC程序发到嵌入式系统端的数据,发是指从嵌入式系统通过串口向PC端发数据。嵌入式系统端的数据输入通过实验箱上小键盘输入完成。3.2.2 异部串行通信的实现异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行I/O 可以减少信号连线,最少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行I/O 方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(

44、即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。 图4 异步串行通信中的字符传送格式具体过程如下: 开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1 位、1。5 位或2 位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“

45、1”。经过一段随机时间后,下一个字符开始传送才又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为110,150,300,600,1200,2400,4800,9600 ,115200等。程序控制流程图如下所示:子操作完成键盘鼠标的模拟,键盘处理程序负责接收用户输入的信息。各部分实现可下文。3.2.3 S3C44B0异步串行口控制器及相关寄存器S3C44B0自带两个异步串行口控制器,每个控制器有16字节的FIFO(先入先出寄存器),最大波特率115。2K。每个UART有7种状态:溢出错误,校验错误,帧错误,暂停态,接收缓冲区准备好,发送缓冲区空,发送移位缓冲

46、器空,这些状态可以由相应的UTRSTATn或UERSTATn寄存器表示,并且与发送接收缓冲区相对应的有错误缓冲区。波特率的大小可以通过设置波特率寄存器(UBRDIVn)控制。计算公式如下: UBRDIVn = (int)(MCLK/(bps x 16) ) -1,其中MCLK 是系统频率,在40MHz的情况下,当波特率取115200时, UBRDIVn = (int)(40000000 / (115200 x 16) + 0。5 ) 1 = 21现将相关寄存器名称中英文对照列表如下:寄存器名称英文表示线路控制寄存器ULCONn 控制寄存器 UCONnFIFO控制寄存器UFCONn 控制寄存器U

47、MCONn 状态寄存器UTRSTAT错误状态寄存器UERSTATFIFO状态寄存器UFSTAT 发送寄存器 UTXH 接收寄存器URXH波特率因子寄存器UBRDIV 表1 UART相关的寄存器中英文名称对照3.2.4 键盘输入与IO这部分主要是通过编写矩阵键盘扫描程序,并将按键键值送往PC端应用程序。键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下,一旦处理器判定有一个键按下,键盘扫描软件将过滤掉抖动并且判定哪个键被按下,每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动,换句话说,扫描码将告诉应用程序按下哪个键。实现

48、方法如下:1,初始化:所有的行(输出端口)被强行设置为低电平2,在没有任何键按下时,所有的列(输入端口)将读到高电平。3,任何键的闭合将造成其中的一列变为低电平。4,一旦检测到有键被按下,就需要找出是哪一个键。过程很简单,微处理器只需在其中一列上输出一个低电平。如果它在输入端口上发现一个0值,微处理器就知道在所选择行上产生了键的闭合。3.2 PC端与ARM嵌入式端的串行通讯实现3.2.1 端与端串口通讯概绍串口通信(Serial Communication), 是指外设和计算机间,本设计是指JX44BO-2嵌入式系统与PC之间,通过串口数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方

49、式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串行通信接口电路一般由可编程的串行接口芯片、波特率发生器、EIA与TTL电平转换器以及地址译码电路组成。3.2.2串口通讯工作方式由于 CPU 与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须要有接收移位寄存器 (串并)和发送移位寄存器(并串)。 在数据输入过程中,数据一位一位地从外设进入接口的接收移位寄存器,当接收移位寄存器中已接收完 1 个字符的各位后,数据就从接收移位寄存器进入数据输入寄存器 在数据输出过程中,CPU 把要输出的字符(并行地)送入数据输出寄存器,数据输

50、出寄存器的内容传输到,发送移位寄存器,然后由发送移位寄存器移位,把数据 一 位一位地送到外设。发送移位寄存器的移位速度由发送时钟确定。 串口通讯数据线接口引脚如下图: 图5 串口数据线引脚图3.2.1 串口数据接收的VC实现 Win 32系统为串行通信提供了全新的服务。传统的OpenComm、ReadComm、WriteComm、CloseComm等函数已经过时,WM_COMMNOTIFY消息也消失了。取而代之的是文件I/O函数提供的打开和关闭通信资源句柄及读写操作的基本接口。 新的文件I/O函数(CreateFile、ReadFile、WriteFile等)支持重叠式输入输出,这使得线程可以

51、从费时的I/O操作中解放出来,从而极大地提高了程序的运行效率。 (1) 串行口的打开和关闭 Win 32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的声明为: HANDLE CreateFile( LPCTSTR lpFileName, / 文件名 DWORD dwDesiredAccess, / 访问模式 DWORD dwShareMode, / 共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttributes, / 通常为NULL DWORD dwCreatio

52、nDistribution, / 创建方式 DWORD dwFlagsAndAttributes, / 文件属性和标志 HANDLE hTemplateFile / 临时文件的句柄,通常为NULL ); 如果调用成功,那么该函数返回文件的句柄,如果调用失败,则函数返回INVALID_HANDLE_VALUE。 (2)串行口的初始化 在打开通信设备句柄后,常常需要对串行口进行一些初始化工作。这需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、每个字符的数据位数、奇偶校验和停止位数等信息。在查询或配置置串行口的属性时,都要用DCB结构来作为缓冲区。 调用GetCommState函数可以获得

53、串口的配置,该函数把当前配置填充到一个DCB结构中。一般在用CreateFile打开串行口后,可以调用GetCommState函数来获取串行口的初始配置。要修改串行口的配置,应该先修改DCB结构,然后再调用SetCommState函数用指定的DCB结构来设置串行口。 除了在DCB中的设置外,程序一般还需要设置I/O缓冲区的大小和超时。Windows用I/O缓冲区来暂存串行口输入和输出的数据,如果通信的速率较高,则应该设置较大的缓冲区。调用SetupComm函数可以设置串行口的输入和输出缓冲区的大小。 在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。如果在指定的时间内没有

54、读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。 COMMTIMEOUTS结构如下: typedef struct _COMMTIMEOUTS DWORD ReadIntervalTimeout; / 读间隔超时 DWORD ReadTotalTimeoutMultiplier; / 读时间系数 DWORD ReadTotalTimeoutConstant; /

55、读时间常量 DWORD WriteTotalTimeoutMultiplier; / 写时间系数 DWORD WriteTotalTimeoutConstant; / 写时间常量 COMMTIMEOUTS,*LPCOMMTIMEOUTS; (3)串口的读与写 在用ReadFile和WriteFile读写串行口时,既可以同步执行,也可以重叠(异步)执行。在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。在重叠执行时,即使操作还未完成,调用的函数也会立即返回。费时的I/O操作在后台进行,这样线程就可以干别的事情。例如,线程可以在不同的句柄上同时执行I/O操

56、作,甚至可以在同一句柄上同时进行读写操作。“重叠”一词的含义就在于此。 ReadFile函数只要在串行口输入缓冲区中读入指定数量的字符,就算完成操作。而WriteFile函数不但要把指定数量的字符拷入到输出缓冲中,而且要等这些字符从串行口送出去后才算完成操作。 ReadFile和WriteFile函数是否为执行重叠操作是由CreateFile函数决定的。如果在调用CreateFile创建句柄时指定了FILE_FLAG_OVERLAPPED标志,那么调用ReadFile和WriteFile对该句柄进行的读写操作就是重叠的,如果未指定重叠标志,则读写操作是同步的。 函数ReadFile和Write

57、File的参数和返回值很相似。这里仅列出ReadFile函数的声明: BOOL ReadFile( HANDLE hFile, / 文件句柄 LPVOID lpBuffer, / 读缓冲区 DWORD nNumberOfBytesToRead, / 要求读入的字节数 LPDWORD lpNumberOfBytesRead, / 实际读入的字节数 LPOVERLAPPED lpOverlapped / 指向一个OVERLAPPED结构 ); /若返回TRUE则表明操作成功 当ReadFile和WriteFile返回FALSE时,不一定就是操作失败,线程应该调用GetLastError函数分析返回

58、的结果。例如,在重叠操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING。 4系统需求分析41 系统角色及其功能分析由于本设计并不涉及到数据库系统,所以该系统的系统角色只有用户而已。用户主要可以用的功能:通过JX44B0-2系统上的键盘按钮控制并完成与PC端模拟软件的交互。42 系统主要功能详细描述 该系统有两大功能,即键盘事件模拟和鼠标事件模拟。用户操作主要在JX44B0-2嵌入式系统上进行。现将用户能够进行操作列举如下: 鼠标事件:(1)鼠标左键单击,由小键盘(位于JX44B0系统)数字键“1”控制。(2)鼠标左键

59、双击,由小键盘(位于JX44B0系统)数字键“3”控制。(3)鼠标光标向上移动,由小键盘(位于JX44B0系统)数字键“2”控制。(4)鼠标光标向下移动,由小键盘(位于JX44B0系统)数字键“5”控制。(5)鼠标光标向左移动,由小键盘(位于JX44B0系统)数字键“4”控制。(6)鼠标光标向右移动,由小键盘(位于JX44B0系统)数字键“6”控制。键盘事件:(7)打印字符串“hello world”,由小键盘(位于JX44B0系统)数字键“7”控制。(8)”ctrl+O”快捷键打开“打开”动作框,由小键盘(位于JX44B0系统)数字键“8”控制。(9)打印字符“a”, 由小键盘(位于JX44

60、B0系统)数字键“9”控制。43 系统功能模块设计功能结构图如下: 图6 功能模块设计图从图中可以看出,系统主要实现了以下功能:鼠标左键单击、鼠标左键双击、鼠标光标向上移动,鼠标光标向下移动、由小键盘(位于JX44B0系统)数字键“5”控制、鼠标光标向左移动、鼠标光标向右移动、打印字符串“hello world”、”ctrl+O”快捷键打开“打开”动作框,打印字符“a”。5 总体设计及实现5.1 总体模块设计该系统是基于B/S架构。实现键盘鼠标事件的模拟。系统使用C+语言开发,利用到串口通信和多线程等技术,整个系统分成两层,有效实现了系统各部分的低偶合。整个系统主要有:表现层。业务层。数据访问层。利用软件分层把系统偶合度降低。在数据访问层,使用接口和和实现分离。上层的服务只依赖于底层的接口,底层的实现方式改变不会影响到上层的服务。这样就会最大程度的降低了软件各部分之间的偶合。便于

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!