《564501028毕业设计(论文)基于嵌入式系统的PC键盘与鼠标交互控制模拟研究.doc》由会员分享,可在线阅读,更多相关《564501028毕业设计(论文)基于嵌入式系统的PC键盘与鼠标交互控制模拟研究.doc(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种状态:溢出错误,校验错误,帧错误,暂停态,接收缓冲区准备好,发送缓冲区空,发送移位缓冲器空,这些状态可以由相应的UTRSTATn或UERSTATn寄存器表示,并且与发送接收缓冲区相对应的有错误缓冲区。波特率的大小可以通过设置波特率寄存器(UBRDIVn)控制。计算公式如下: UBRDIVn = (int)(MCLK/(bps x 16) ) -1,其中MCLK 是系统频率,在40MHz的情况下,当波特率取115200时, UBRDIVn = (int)(40000000 / (115200 x 16) + 0。5 ) 1 = 21现将相关寄存器名称中英文对照列表如下:寄存器名称英文表示线路控制寄存器U