564501028畢業(yè)設(shè)計(jì)(論文)基于嵌入式系統(tǒng)的PC鍵盤與鼠標(biāo)交互控制模擬研究_第1頁
564501028畢業(yè)設(shè)計(jì)(論文)基于嵌入式系統(tǒng)的PC鍵盤與鼠標(biāo)交互控制模擬研究_第2頁
564501028畢業(yè)設(shè)計(jì)(論文)基于嵌入式系統(tǒng)的PC鍵盤與鼠標(biāo)交互控制模擬研究_第3頁
564501028畢業(yè)設(shè)計(jì)(論文)基于嵌入式系統(tǒng)的PC鍵盤與鼠標(biāo)交互控制模擬研究_第4頁
564501028畢業(yè)設(shè)計(jì)(論文)基于嵌入式系統(tǒng)的PC鍵盤與鼠標(biāo)交互控制模擬研究_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、*大學(xué)畢業(yè)論文(設(shè)計(jì))基于嵌入式系統(tǒng)的pc鍵盤與鼠標(biāo)交互控制模擬研究 2006級計(jì)算機(jī)科學(xué)與技術(shù)*班 * 指導(dǎo)教師 張三 【摘要】隨著信息技術(shù)發(fā)展,各類應(yīng)用軟件不斷豐富。已有的商用軟件的高效率切入成為一個十分棘手的問題。如一款基于pc的性能完備的操縱訓(xùn)練軟件,常以鍵盤與鼠標(biāo)作為模擬輸入設(shè)備,但這與真實(shí)的操作方式大相徑庭,若能采用嵌入式系統(tǒng)開發(fā)一款操縱方式更加人性化、可再現(xiàn)原有鍵盤與鼠標(biāo)控制功能的軟硬結(jié)合的模擬系統(tǒng),將使原有商用軟件應(yīng)用功能得到極大升華。隨著硬件技術(shù)和自動化技術(shù)的不斷發(fā)展,基于嵌入式技術(shù)各種系統(tǒng)模擬技術(shù)已經(jīng)相當(dāng)成熟。本系統(tǒng)是基于arm嵌入式系統(tǒng)以及pc系統(tǒng),結(jié)合所學(xué)計(jì)算機(jī)專業(yè)課程

2、知識點(diǎn)開發(fā)設(shè)計(jì)一個基于嵌入式系統(tǒng)的pc鍵盤與鼠標(biāo)交互控制模擬系統(tǒng)?!娟P(guān)鍵字】鍵盤鼠標(biāo)模擬;arm嵌入式系統(tǒng);pc系統(tǒng);交互控制模擬; 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 effi

3、ciencily with 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

4、 and convenient 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 technol

5、ogy 。 【key words】 keyboard and mouse simulation; arm embedded system; pc system ;simulation of interactive control;vc+目錄1緒論41.1開發(fā)背景介紹41.2 系統(tǒng)主要實(shí)現(xiàn)目標(biāo)41.3 論文結(jié)構(gòu)概述52開發(fā)環(huán)境和開發(fā)工具簡介52.1 microsoft visual c+ 6.0項(xiàng)目概述 :52.2 c+語言簡介52.2.1 c+語言特性52.2.2 winapi編程特性62.3 adt概述:72.3.1 adt嵌入式系統(tǒng)開發(fā)環(huán)境概述72.3.2 adt與arm嵌入式系統(tǒng)及pc系

6、統(tǒng)的連接82.3.3 jx44b0-2嵌入式系統(tǒng)實(shí)驗(yàn)平臺概紹83 程序結(jié)構(gòu)、思想和相關(guān)技術(shù)介紹83.1 pc端軟件的鍵盤與鼠標(biāo)事件的仿真實(shí)現(xiàn)8311 pc端軟件功能概紹83.1.2 鍵盤事件的模擬仿真83.1.3 鼠標(biāo)事件的模擬仿真103.1.4多線程技術(shù)的引入133.2 arm嵌入式系統(tǒng)端程序的設(shè)計(jì)與實(shí)現(xiàn)143.2.1 arm端程序功能概紹143.2.2 異部串行通信的實(shí)現(xiàn)143.2.3 s3c44b0異步串行口控制器及相關(guān)寄存器163.2.4 鍵盤輸入與io163.2 pc端與arm嵌入式端的串行通訊實(shí)現(xiàn)173.2.1 端與端串口通訊概紹173.2.2串口通訊工作方式173.2.1 串口數(shù)

7、據(jù)接收的vc實(shí)現(xiàn)184系統(tǒng)需求分析204.1 系統(tǒng)角色及其功能分析204.2 系統(tǒng)主要功能詳細(xì)描述204.3 系統(tǒng)功能模塊設(shè)計(jì)205 總體設(shè)計(jì)及實(shí)現(xiàn)215.1 總體模塊設(shè)計(jì)215.2 各子系統(tǒng)模塊總體設(shè)計(jì)235.2.1 jx44bo-2嵌入式系統(tǒng)端設(shè)計(jì)235.2.2 pc系統(tǒng)端程序設(shè)計(jì)256 系統(tǒng)詳細(xì)設(shè)計(jì)276.1 pc端系統(tǒng)的具體實(shí)現(xiàn)與程序編寫276.1.1 鼠標(biāo)事件模擬的實(shí)現(xiàn)276.1.2 鍵盤事件模擬的實(shí)現(xiàn)306.1.3 多線程技術(shù)的實(shí)現(xiàn)326.1.4串口數(shù)據(jù)接收程序的vc實(shí)現(xiàn)356.2 arm嵌入式系統(tǒng)端的具體實(shí)現(xiàn)與程序編寫416.2.1串口通訊的實(shí)現(xiàn)416.2.2 鍵盤掃描功能的實(shí)現(xiàn)

8、467 結(jié)束語488致謝489 參考文獻(xiàn)49附錄1 pc端程序清單50附錄2 arm嵌入式系統(tǒng)端程序清單561 緒論1.1開發(fā)背景介紹在windows大行其道的今天,windows界面程序受到廣大用戶的歡這些程序的操作不外乎兩種,鍵盤輸入控制和鼠標(biāo)輸入控制。有時,對于繁雜的,或重復(fù)性的輸入操作,我們能否通過編制程序來代替手工輸入,而用程序來模擬鍵盤及鼠標(biāo)的輸入呢?答案是肯定的。本系統(tǒng)就是基于arm嵌入式系統(tǒng)以及pc系統(tǒng)的 pc鍵盤與鼠標(biāo)交互控制模擬系統(tǒng)。這一研究不僅可解決已有操縱訓(xùn)練系統(tǒng)的直觀輸入問題,而且還可能更大限度的發(fā)揮已有軟件面向個性化應(yīng)用的極大效率,具有很大的現(xiàn)實(shí)意義。12 系統(tǒng)主要

9、實(shí)現(xiàn)目標(biāo)主要實(shí)現(xiàn)目標(biāo):首先要求完成pc端軟件的鍵盤與鼠標(biāo)事件仿真。pc端軟件的鍵盤與鼠標(biāo)事件仿真主要通過以下兩個windows api 函數(shù)來實(shí)現(xiàn):模擬鍵盤用keybd_event這個api函數(shù),模擬鼠標(biāo)按鍵用mouse_event函數(shù)。編程語言選用vc+語言。并增加增加異步通信功能可通過windows下的異步調(diào)用來實(shí)現(xiàn)。然后,在嵌入式系統(tǒng)端完成d/a控制與模擬量,開關(guān)量控制,并開發(fā)實(shí)時異步通信功能。編程調(diào)試環(huán)境為arm7嵌入式系統(tǒng)。最后,實(shí)現(xiàn)pc端與嵌入式系統(tǒng)端整體連接并調(diào)試,通信采用串行通訊方式。13 論文結(jié)構(gòu)概述 在此次畢業(yè)論文中,首先對開發(fā)中所有到的相關(guān)技術(shù)進(jìn)行了簡單介紹:包括adt1

10、000體系結(jié)構(gòu)和安裝,以及開發(fā)環(huán)境的配置;vc+語言的特征和他的應(yīng)用前景;windows api的編程的工作原理和他的優(yōu)點(diǎn);arm嵌入式編程的技術(shù)原理;程序的整體框架和工作原理。然后是對需求分析和詳細(xì)設(shè)計(jì) ,以及對本人所作模塊的展示和部分實(shí)現(xiàn)代碼。2 開發(fā)環(huán)境和開發(fā)工具簡介21 microsoft visual c+ 6.0項(xiàng)目概述 : visual c+ 6.0是微軟公司推出的開發(fā)win32應(yīng)用程序,面向windows95/98/2000/xp/nt操作系統(tǒng)的、面向?qū)ο蟮目梢暬晒ぞ?。它的最大?yōu)點(diǎn)就是提供了功能強(qiáng)大的mfc類庫,mfc是一個很大的c 類層次結(jié)構(gòu),其中封裝了大量的類及其函數(shù),

11、很多windows程序所共有的標(biāo)準(zhǔn)內(nèi)容可以由mfc的類來提供,mfc類為這些內(nèi)容提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個輪廓,這將簡化編程工作,大大的減少程序員編寫的代碼數(shù)量,使編程工作變得更加輕松容易。 本項(xiàng)目中主要用到的是windows api編程的windowssdk(軟件開發(fā)工具)。22 c+語言簡介221 c+語言特性c語言系列的編程語言是當(dāng)今非常流行的程序設(shè)計(jì)語言,它是由dennis richie在貝爾實(shí)驗(yàn)室研制開發(fā)的一個具有通用性的結(jié)構(gòu)化程序設(shè)計(jì)語言,它融匯了高效,靈活等設(shè)計(jì)思想,具有較高的可移植性。 c語言的另一個重要特點(diǎn)

12、是,比起其他編程語言來,c語言的使用非常靈活。比如在使用典型的結(jié)構(gòu)化語言pascal時,必須要實(shí)現(xiàn)在指定的區(qū)域聲明變量或函數(shù),然后在另一指定位置實(shí)現(xiàn)函數(shù)等。又比如,使用qbasic語言,需要指定每行語句的行號,程序?qū)创a的行號依次執(zhí)行。c語言在變量聲明、函數(shù)定語言的組織、算法設(shè)計(jì)等方面并沒有過于嚴(yán)格的限制。在基本語法特點(diǎn)方面,c+語言保持與c語言兼并,二者沒有本質(zhì)上的差別,大多數(shù)使用c語言編寫的代碼可以在c+語言中直接使用。這也是c+語言很快普及的一個重要原因。 c+語言與c語言的主要區(qū)別是編程思想上的更新,即編碼由面向過程變?yōu)槊嫦驅(qū)ο螅诖?,c+語言引入了類與對象機(jī)制,包括類的定于,類的

13、繼承與派生,類的多態(tài)性等。 在類定義方面,c+語言一方面自定義結(jié)構(gòu)類型進(jìn)行擴(kuò)充,另一方面也支持新的類構(gòu)造。 數(shù)據(jù)封裝和隱藏是與類的定義緊密相關(guān),并且在c+語言中經(jīng)常碰到的現(xiàn)象,也是c+語言中的一大特點(diǎn)。數(shù)據(jù)的封裝和隱藏使重要的內(nèi)部數(shù)據(jù)得到保護(hù)。222 winapi編程特性視窗操作系統(tǒng)應(yīng)用程序接口(windows api),有非正式的簡稱法為winapi,是微軟對于windows操作系統(tǒng)中可用的內(nèi)核應(yīng)用程序編程接口的稱法。它設(shè)計(jì)為由c/c+程序調(diào)用,而且它也是應(yīng)用軟件與windows系統(tǒng)最直接的交互方式。而大多數(shù)驅(qū)動程序所需要的對windows系統(tǒng)的更底層次訪問接口,由所用版本的windows的

14、native api來提供接口。 windows有一個軟件開發(fā)包(sdk, software development kit)提供相應(yīng)的文檔和工具,以使程序員開發(fā)使用windows api的軟件和利用windows技術(shù)。windows api總會為程序員提供大量的構(gòu)建不同windows的底層結(jié)構(gòu),這有助于為windows程序員開發(fā)應(yīng)用程序提供大量的靈活性和功能。但是,它同樣使windows applications要負(fù)責(zé)處理大量底層且有時是繁瑣的與圖形用戶界面(gui)相關(guān)的操作。windows api應(yīng)用程序框架如下圖所示: 圖1 windows api應(yīng)用程序框架 windows api所

15、提供的功能可以歸為七類: 基礎(chǔ)服務(wù)(base services)5,提供對windows系統(tǒng)可用的基礎(chǔ)資源的訪問接口。比如象:文件系統(tǒng)(file system)、外部設(shè)備(device)、, 進(jìn)程(process)、線程(thread)以及訪問注冊表(windows registry)和錯誤處理機(jī)制(error handling)。這些功能接口位于,16位windows下的kernel。exe、krnl286。exe或krnl386。exe系統(tǒng)文件中;以及32位windows下的 kernel32。dll和advapi32。dll中。 圖形設(shè)備接口(gdi)6,提供功能為:輸出圖形內(nèi)容到顯示器

16、、打印機(jī)以及其他外部輸出設(shè)備。它位于16位windows下的gdi。exe;以及32位windows下的gdi32。dll。 圖形化用戶界面(gui)7,提供的功能有創(chuàng)建和管理屏幕和大多數(shù)基本控件(control),比如按鈕和滾動條。接收鼠標(biāo)和鍵盤輸入,以及其他與gui有關(guān)的功能。這些調(diào)用接口位于:16位windows下的user。exe, 以及32位windows下的user32。dll。從windows xp版本之后, 基本控件和通用對話框控件(common control library)的調(diào)用接口放在comctl32。dll中。 通用對話框鏈接庫(common dialog box l

17、ibrary)8,為應(yīng)用程序提供標(biāo)準(zhǔn)對話框,比如打開/保存文件對話框、顏色對畫框和字體對話框等等。這個鏈接庫位于:16位windows下的commdlg。dll中,以及32位windows下comdlg32。dll中。它被歸類為user interface api之下。 通用控件鏈接庫(common control library)9,為應(yīng)用程序提供接口來訪問操作系統(tǒng)提供的一些高級控件。比如像:狀態(tài)欄(status bar)、進(jìn)度條(progress bars)、工具欄(toolbar)和標(biāo)簽(tab)。這個鏈接庫位于:16位windows下的commctrl。dll中,以及32位window

18、s下comctl32。dll中。 它被歸類為user interface api之下。 windows外殼(windows shell)1011,作為windows api的組成部分,不僅允許應(yīng)用程序訪問操作系統(tǒng)shell提供的功能,還對之有所改進(jìn)和增強(qiáng)。它位于16位windows下的shell。dll中,以及32位windows下的shell32。dll中(windows 95則在 shlwapi。dll中)。 它被歸類為user interface api之下。 網(wǎng)絡(luò)服務(wù)(network services)12,為訪問操作系統(tǒng)提供的多種網(wǎng)絡(luò) 功能提供接口。它包括netbios、winsoc

19、k、netdde及rpc等。 23 adt概述:231 adt嵌入式系統(tǒng)開發(fā)環(huán)境概述adt(arm development tools)嵌入式系統(tǒng)開發(fā)環(huán)境是由武漢創(chuàng)維特信息技術(shù)有限公司開發(fā)的具有自主知識產(chǎn)權(quán)的應(yīng)用于嵌入式軟件開發(fā)的集成軟,硬件開發(fā)平臺。它為基于arm核的嵌入式應(yīng)用提供了一整套完備的開發(fā)方案,包括程序編輯,工程管理和設(shè)置,程序調(diào)試等。adt嵌入式開發(fā)環(huán)境由adt emulator for arm和adt ide for arm組成。本設(shè)計(jì)主要用到adt ide for arm來完成。 adt ide forarm為用戶提供高效明晰的圖形化嵌入式軟件開發(fā)環(huán)境,包括一套完備的面向嵌入

20、式系統(tǒng)開發(fā)和調(diào)試工具:集源碼編輯器,工程管理器,工程編譯器,集成調(diào)試環(huán)境,adt emulatorfor調(diào)試接口等。其界面同icrosoftisualtudio環(huán)境相似,用戶可以在for集成開發(fā)環(huán)境中創(chuàng)建工程,打開工醫(yī)囑,建立打開和編譯文件,編譯,連接,設(shè)置,運(yùn)行,調(diào)試嵌入式應(yīng)用程序。232 adt與arm嵌入式系統(tǒng)及pc系統(tǒng)的連接連續(xù)圖如下所示: 圖2 adt與pc系統(tǒng)及嵌入式系統(tǒng)連接圖2.3.3 jx44b0-2嵌入式系統(tǒng)實(shí)驗(yàn)平臺概紹jx44b0-1b是一購入式系統(tǒng)教學(xué)系統(tǒng)采用統(tǒng)一的豪華實(shí)驗(yàn)箱包裝,除adt1000仿真器外,所有配件均放置于實(shí)驗(yàn)箱之內(nèi),所包含配件如下: 1、jx44b0-1

21、b主板一塊; 2、adt1000仿真器一套(為可選配置); 3、320 x 240 256色彩色lcd顯示器一塊(帶觸摸屏); 4、4 x 4鍵盤一套; 5、usb連接電纜一條; 6、pc并口延長電纜一條; 7、rs-232串口通訊線一條; 8、直連網(wǎng)線一根;9、軟件光盤一張; 10、實(shí)驗(yàn)指導(dǎo)書一本;3 程序結(jié)構(gòu)、思想和相關(guān)技術(shù)介紹31 pc端軟件的鍵盤與鼠標(biāo)事件的仿真實(shí)現(xiàn)311 pc端軟件功能概紹pc端的軟件設(shè)計(jì)要求實(shí)現(xiàn)對鍵盤事件的按鍵動作(包括單鍵按下及組合鍵按下)和鼠標(biāo)事件(包括移動光標(biāo)位置,鼠標(biāo)左右鍵的單擊,雙擊等)的模擬仿真。并且在程序中要增加異步通信功能,并且引入多線程技術(shù),使得程

22、序具有更好和響應(yīng)性和高效率。312 鍵盤事件的模擬仿真我們來先了解一下windows中響應(yīng)鍵盤事件的機(jī)制。當(dāng)用戶按下鍵盤上的一個鍵時,鍵盤內(nèi)的芯片會檢測到這個動作,并把這個信號傳送到計(jì)算機(jī)。鍵盤上的所有按鍵都有一個編碼,稱作鍵盤掃描碼。當(dāng)按下一個鍵時,這個鍵的掃描碼就被傳給系統(tǒng)。掃描碼是跟具體的硬件相關(guān)的,同一個鍵,在不同鍵盤上的掃描碼有可能不同。鍵盤控制器就是將這個掃描碼傳給計(jì)算機(jī),然后交給鍵盤驅(qū)動程序。鍵盤驅(qū)動程序會完成相關(guān)的工作,并把這個掃描碼轉(zhuǎn)換為鍵盤虛擬碼。什么是虛擬碼呢?因?yàn)閽呙璐a與硬件相關(guān),不具有通用性,為了統(tǒng)一鍵盤上所有鍵的編碼,于是就提出了虛擬碼概念。無論什么鍵盤,同一個按鍵

23、的虛擬碼總是相同的,這樣程序就可以識別了。簡單點(diǎn)說,虛擬碼就是我們經(jīng)??梢钥吹降南駐k_a,vk_b這樣的常數(shù),比如鍵a的虛擬碼是65,寫成16進(jìn)制就是&h41。當(dāng)鍵盤驅(qū)動程序把掃描碼轉(zhuǎn)換為虛擬碼后,會把這個鍵盤操作的掃描碼和虛擬碼還有其它信息一起傳遞給操作系統(tǒng)。然后操作系統(tǒng)則會把這些信息封裝在一個消息中,并把這個鍵盤消息插入到消息列隊(duì)。掌握了這個過程,我們就可以編程實(shí)現(xiàn)在其中的某個環(huán)節(jié)來模擬鍵盤操作了。有多種方法可以實(shí)現(xiàn)鍵盤模擬,我們就介紹幾種比較典型有:(1)局部級模擬: -postmessagea -sendmessagea -mapvirtualkeya 從上面的流程可以看出,鍵盤事件

24、是最終被送到活動窗口,然后才引起目標(biāo)程序響應(yīng)的。所以局部級模擬方法就是利用postmessagea,sendmessagea,mapvirtualkeya這三個api函數(shù)相互配合,直接偽造一個鍵盤消息發(fā)給目標(biāo)程序。由于本設(shè)計(jì)沒用這種方法,故不做深入探討。(2)驅(qū)動級模擬: 驅(qū)動級模擬直接讀寫鍵盤的硬件端口,這種直接讀寫鍵盤端口的方法來模擬硬件事件的方法繞過了windows的消息機(jī)制,而直接與鍵盤驅(qū)動程序打交道,效率提高了很多。在此因本設(shè)計(jì)沒涉及,故不深入討論。(3)全局級模擬: -keybd_event -sendinput -setwindowshookexa 在全局事件中,鍵盤事件不是直接

25、送到活動窗口,而是送給了操作系統(tǒng),模擬全局鍵盤息常用api函數(shù)keybd_event來實(shí)現(xiàn)。下面具體討論全局級模擬: 有些程序(特別是一些游戲)出于某些原因,會禁止用戶對它使用模擬按鍵程序,或者能夠檢查出收到的鍵盤消息與真實(shí)的按鍵和模擬的按鍵消息總是有一些小差別,從這些小差別上,目標(biāo)程序就能判斷出:這是假的!是偽造的!因此,如果用postmessage發(fā)送局部消息模擬按鍵不成功的話,你可以試一試全局級的鍵盤消息。模擬全局鍵盤消息常見的可以有以下一些方法:(1) 用api函數(shù)keybd_event,這個函數(shù)可以用來模擬一個鍵盤事件,它的聲明為:void keybd_event(byte bvk,

26、byte bscan,dword dwflags,dword dwextralnfo); 參數(shù)說明: bvk:定義一個虛擬鍵碼。鍵碼值必須在1254之間。 bscan:定義該鍵的硬件掃描碼。 dwflags:定義函數(shù)操作的名個方面的一個標(biāo)志位集。應(yīng)用程序可使用如下一些預(yù)定義常數(shù)的組合設(shè)置標(biāo)志位。 keyeventf_exetendedkey:若指定該值,則掃描碼前一個值為oxeo(224)的前綴字節(jié)。keyeventf_keyup:若指定該值,該鍵將被釋放;若未指定該值,該鍵交被接下。dwextralnfo:定義與擊鍵相關(guān)的附加的32位值。 (2) 返回值:該函數(shù)無返回值。(3) 舉例說明,比

27、如要模擬按下a鍵,可以這樣:const keyeventf_keyup = &h2keybd_event( vk_a, 0, 0, 0 );/ 按下a鍵keybd_event( vk_a, 0, keyeventf_keyup, 0 ); / 釋放a鍵注意有時候按鍵的速度不要太快,否則會出問題,可以用api函數(shù)sleep來進(jìn)行延時。那么如果要模擬按下功能鍵怎么做呢?比如要按下ctrl+c實(shí)現(xiàn)拷貝這個功能,可以這樣:keybd_event (vk_ctrl, 0, 0, 0 ); / 按下ctrl鍵keybd_event (vk_c, 0, 0, 0 ) ; / 按下c鍵sleep (500 )

28、 ; /延時500毫秒keybd_event (vk_c, 0, keyeventf_keyup, 0 ); / 釋放c鍵keybd_event (vk_ctrl, 0, keyeventf_keyup, 0 ) ; / 釋放ctrl鍵盡管keybd_event傳遞一個與oem相關(guān)的硬件掃描碼給系統(tǒng),但應(yīng)用程序不能用此掃描碼。系統(tǒng)在內(nèi)部將掃描碼轉(zhuǎn)換成虛擬鍵碼,并且在傳送給應(yīng)用程序前清除鍵碼的up/down位。應(yīng)用程序可以摸擬printscreen鍵的按下來獲得一個屏幕快照,并把它存放到剪切板中。若要做到這一點(diǎn),則要將keybd_event的bvk參數(shù)置為vk_snapshot,bscan參數(shù)置

29、為0(用以獲得全屏快照)或hscan置為1(僅獲得活動窗口的快照)。windows ce:windowsce支持dwflags參數(shù)附加的標(biāo)志位。即使用keyeventf_silent標(biāo)志模擬擊鍵,而不產(chǎn)生敲擊的聲音。windows ce不支持keyeventf_extendedkey標(biāo)志。313 鼠標(biāo)事件的模擬仿真鼠標(biāo)事件的模擬主要由以下三個函數(shù)來實(shí)現(xiàn):(1)mouse_event函數(shù) 函數(shù)功能:該函數(shù)綜合鼠標(biāo)擊鍵和鼠標(biāo)動作。 函數(shù)原型: void mouse_event( dword dwflags, / motion and click options dword dx, / horizo

30、ntal position or change dword dy, / vertical position or change dword dwdata, / wheel movement ulong_ptr dwextrainfo / application-defined information ); 參數(shù): dwflags:標(biāo)志位集,指定點(diǎn)擊按鈕和鼠標(biāo)動作的多種情況。此參數(shù)里的各位可以是下列值的任何合理組合: mouseeventf_absolute:表明參數(shù)dx,dy含有規(guī)范化的絕對坐標(biāo)。如果不設(shè)置此位,參數(shù)含有相對數(shù)據(jù):相對于上次位置的改動位置。此標(biāo)志可被設(shè)置,也可不設(shè)置,不管鼠標(biāo)的

31、類型或與系統(tǒng)相連的類似于鼠標(biāo)的設(shè)備的類型如何。要得到關(guān)于相對鼠標(biāo)動作的信息,參見下面?zhèn)渥⒉糠帧?mouseeventf_move:表明發(fā)生移動。 mouseeventf_leftdown:表明接按下鼠標(biāo)左鍵。 mouseeventf_leftup:表明松開鼠標(biāo)左鍵。 mouseeventf_rightdown:表明按下鼠標(biāo)右鍵。 mouseeventf_rightup:表明松開鼠標(biāo)右鍵。 mouseeventf_middledown:表明按下鼠標(biāo)中鍵。 mouseeventf_middleup:表明松開鼠標(biāo)中鍵。 mouseeventf_wheel:在windows nt中如果鼠標(biāo)有一個輪,表

32、明鼠標(biāo)輪被移動。移動的數(shù)量由dwdata給出。 dx:指定鼠標(biāo)沿x軸的絕對位置或者從上次鼠標(biāo)事件產(chǎn)生以來移動的數(shù)量,依賴于mouseeventf_absolute的設(shè)置。給出的絕對數(shù)據(jù)作為鼠標(biāo)的實(shí)際x坐標(biāo);給出的相對數(shù)據(jù)作為移動的mickeys數(shù)。一個mickey表示鼠標(biāo)移動的數(shù)量,表明鼠標(biāo)已經(jīng)移動。 dy:指定鼠標(biāo)沿y軸的絕對位置或者從上次鼠標(biāo)事件產(chǎn)生以來移動的數(shù)量,依賴于mouseeventf_absolute的設(shè)置。給出的絕對數(shù)據(jù)作為鼠標(biāo)的實(shí)際y坐標(biāo),給出的相對數(shù)據(jù)作為移動的mickeys數(shù)。 dwdata:如果dwflags為mouseeventf_wheel,則dwdata指定鼠標(biāo)輪

33、移動的數(shù)量。正值表明鼠標(biāo)輪向前轉(zhuǎn)動,即遠(yuǎn)離用戶的方向;負(fù)值表明鼠標(biāo)輪向后轉(zhuǎn)動,即朝向用戶。一個輪擊定義為wheel_delta,即120。 如果dwflagss不是mouseeventf_wheel,則dwdata應(yīng)為零。 dwextralnfo:指定與鼠標(biāo)事件相關(guān)的附加32位值。應(yīng)用程序調(diào)用函數(shù)getmessgeextrainfo來獲得此附加信息。 返回值:無。 備注:如果鼠標(biāo)被移動,用設(shè)置mouseeventf_move來表明,dx和dy保留移動的信息。給出的信息是絕對或相對整數(shù)值。 如果指定了mouseeventf_absolute值,則dx和dy含有標(biāo)準(zhǔn)化的絕對坐標(biāo),其值在0到6553

34、5之間。事件程序?qū)⒋俗鴺?biāo)映射到顯示表面。坐標(biāo)(0,0)映射到顯示表面的左上角,(65535,65535)映射到右下角。 如果沒指定mouseeventf_absolute,dx和dy表示相對于上次鼠標(biāo)事件產(chǎn)生的位置(即上次報(bào)告的位置)的移動。正值表示鼠標(biāo)向右(或下)移動;負(fù)值表示鼠標(biāo)向左(或上)移動。 鼠標(biāo)的相對移動服從鼠標(biāo)速度和加速度等級的設(shè)置,一個最終用戶用鼠標(biāo)控制面板應(yīng)用程序來設(shè)置這些值,應(yīng)用程序用函數(shù)systemparameterslnfo來取得和設(shè)置這些值。 在應(yīng)用加速時系統(tǒng)對指定相對鼠標(biāo)移動提供了兩個測試。如果指定的沿x軸y軸的距離比第一個鼠標(biāo)閾值大,并且鼠標(biāo)的加速等級非零,則操作

35、系統(tǒng)將距離加倍。如果指定的沿x軸或y軸的距離比第二個鼠標(biāo)閾值大,并且鼠標(biāo)的加速等級為2,則操作系統(tǒng)將從第一個閾測試得來的距離加倍。這樣就允許操作系統(tǒng)將指定鼠標(biāo)沿x軸或y軸的相對位移加到4倍。 一旦應(yīng)用了加速,系統(tǒng)用期望的鼠標(biāo)速度換算合成的值。鼠標(biāo)速度的范圍是從1(最慢)到20(最快),并代表基于鼠標(biāo)移動的距離指示符移動的數(shù)量。缺省值是10,表示對鼠標(biāo)的移動設(shè)有附加的修改。 函數(shù)mouse_event需要用的應(yīng)用程序用來合成鼠標(biāo)事件。也被應(yīng)用程序用來取得鼠標(biāo)位置和鼠標(biāo)按鍵狀態(tài)之外的鼠標(biāo)信息。例如,如果輸入板制造商想將基于畫筆的信息傳給自己的應(yīng)用程序,可以寫一個直接與輸入板硬件通信的動態(tài)鍵接庫(d

36、ll),獲得附加的信息,并保存到一個隊(duì)列中。dll然后調(diào)用 mouse_event,用標(biāo)準(zhǔn)按鍵和x/y位置數(shù)據(jù),并在參數(shù)dwextralnfo設(shè)置排列的附加信息的指針或索引。當(dāng)應(yīng)用程序需要附加信息時,調(diào)用 dll(連同存貯在dwextralnfo中的指針或索引),則dll返回附加信息。(2)getcursorpos函數(shù)函數(shù)功能:該函數(shù)檢取光標(biāo)的位置,以屏幕坐標(biāo)表示。 函數(shù)原型:bool getcursorpos(lppolnt ippoint); 參數(shù): ippint:point結(jié)構(gòu)指針,該結(jié)構(gòu)接收光標(biāo)的屏幕坐標(biāo)。 使用時要先定義一個數(shù)據(jù)結(jié)構(gòu): public type pointapi x a

37、s long y as long end type 例如: dim biao as pointapi getcursorpos biao 那么biao。x用來存放當(dāng)前光標(biāo)的x軸坐標(biāo),biao。y用來存放當(dāng)前y軸的坐標(biāo)。 返回值:如果成功,返回值非零;如果失敗,返回值為零。若想獲得更多錯誤信息,請調(diào)用getlasterror函數(shù)。 備注:。光標(biāo)的位置通常以屏幕坐標(biāo)的形式給出,它并不受包含該光標(biāo)的窗口的映射模式的影響。該調(diào)用過程必須具有對窗口站的winsta_readattributes訪問權(quán)限。此函數(shù)為api函數(shù),調(diào)用時要函數(shù)聲明:public declare function getcurso

38、rpos lib user32 (lppoint as pointapi) as long。(3)setcursorpos函數(shù)函數(shù)功能:該函數(shù)把光標(biāo)移到屏幕的指定位置。如果新位置不在由 clipcursor函數(shù)設(shè)置的屏幕矩形區(qū)域之內(nèi),則系統(tǒng)自動調(diào)整坐標(biāo),使得光標(biāo)在矩形之內(nèi)。 函數(shù)原型:bool setcursorpos(int x,int y); 參數(shù): x:指定光標(biāo)的新的x坐標(biāo),以屏幕坐標(biāo)表示。 y:指定光標(biāo)的新的y坐標(biāo),以屏幕坐標(biāo)表示。 返回值:如果成功,返回非零值;如果失敗,返回值是零,若想獲得更多錯誤信息,請調(diào)用getlasterror函數(shù)。 備注:該光標(biāo)是共享資源,僅當(dāng)該光標(biāo)在一個窗

39、口的客戶區(qū)域內(nèi)時它才能移動該光標(biāo)。314多線程技術(shù)的引入 在以前只有進(jìn)程的操作系統(tǒng)中,進(jìn)程是處理器調(diào)用的對象,但是多個進(jìn)程并發(fā)時,進(jìn)程切換帶來的開銷所占的比例越來越大,而且進(jìn)程之間的通信效率也大大受到限制,因此就引入了多線程技術(shù),此時線程成了處理器處理的對象,大大改善了處理器的效率,并減少了開發(fā)并行程序時的空間和時間開銷。 所以,在本設(shè)計(jì)的pc端程序中引入多線程是有必要的,本線程次設(shè)計(jì)中主要用到兩個線程,一個工作線程,主要用來處理數(shù)據(jù),對鍵盤鼠標(biāo)事件進(jìn)行模擬,另一個線程主要用于接收串口數(shù)據(jù)。在兩個線程的相互配合下,實(shí)現(xiàn)了pc端程序的異步通信,大大提高了程序和效率和響應(yīng)速度。 多線程程序的一般框

40、架如下: 圖3 多線程應(yīng)用程序框架線程函數(shù)的輸入一個lpvoid型的參數(shù),可以是一個dword型的整數(shù),也可以是一個指向一個緩沖區(qū)的指針, 返回一個dword型的值。象winmain函數(shù)一樣,這個函數(shù)并不由操作系統(tǒng)調(diào)用, 操作系統(tǒng)調(diào)用包含在kernel32。dll中的非c運(yùn)行時的一個內(nèi)部函數(shù),如startofthread,然后由startofthread函數(shù)建立起一個異常處理框架后,調(diào)用我們的函數(shù)。一個進(jìn)程的主線程是由操作系統(tǒng)自動生成,如果你要讓一個主線程創(chuàng)建額外的線程,你可以調(diào)用來createthread完成。createthread定義如下: handle createthread(lps

41、ecurity_attributes lpsa,dwordcbstack,lpthread_start_routinelpstartaddr, lpvoid lpvthreadparm,dwordfdwcreate,lpdwordlpidthread);其中l(wèi)psa參數(shù)為一個指向security_attributes結(jié)構(gòu)的指針。如果想讓對象為缺省安全屬性的話,可以傳一個null,如果想讓任一個子進(jìn)程都可繼承一個該線程對象句柄,必須指定一個security_attributes結(jié)構(gòu),其中binherithandle成員初始化為true。參數(shù)cbstack表示線程為自己所用堆棧分配的地址空間大小,

42、0表示采用系統(tǒng)缺省值。參數(shù)lpstartaddr為新線程開始執(zhí)行時所在函數(shù)的地址,即為線程函數(shù)。lpvthreadparm為傳入線程函數(shù)的參數(shù),fdwcreate參數(shù)指定控制線程創(chuàng)建的附加標(biāo)志,可以取兩種值。如果該參數(shù)為0,線程就會立即開始執(zhí)行,如果該參數(shù)為create_suspended,則系統(tǒng)產(chǎn)生線程后,初始化cpu,登記context結(jié)構(gòu)的成員,準(zhǔn)備好執(zhí)行該線程函數(shù)中的第一條指令,但并不馬上執(zhí)行,而是掛起該線程。最后一個參數(shù)lpidthread 是一個dword類型地址,返回賦給該新線程的id值。3.2 arm嵌入式系統(tǒng)端程序的設(shè)計(jì)與實(shí)現(xiàn)3.2.1 arm端程序功能概紹在arm端實(shí)現(xiàn)用查

43、詢方式對串口數(shù)據(jù)的收發(fā)功能。收是指接收pc程序發(fā)到嵌入式系統(tǒng)端的數(shù)據(jù),發(fā)是指從嵌入式系統(tǒng)通過串口向pc端發(fā)數(shù)據(jù)。嵌入式系統(tǒng)端的數(shù)據(jù)輸入通過實(shí)驗(yàn)箱上小鍵盤輸入完成。3.2.2 異部串行通信的實(shí)現(xiàn)異步串行方式是將傳輸數(shù)據(jù)的每個字符一位接一位(例如先低位、后高位)地傳送。數(shù)據(jù)的各不同位可以分時使用同一傳輸通道,因此串行i/o 可以減少信號連線,最少用一對線即可進(jìn)行。接收方對于同一根線上一連串的數(shù)字信號,首先要分割成位,再按位組成字符。為了恢復(fù)發(fā)送的信息,雙方必須協(xié)調(diào)工作。在微型計(jì)算機(jī)中大量使用異步串行i/o 方式,雙方使用各自的時鐘信號,而且允許時鐘頻率有一定誤差,因此實(shí)現(xiàn)較容易。但是由于每個字符都

44、要獨(dú)立確定起始和結(jié)束(即每個字符都要重新同步),字符和字符間還可能有長度不定的空閑時間,因此效率較低。 圖4 異步串行通信中的字符傳送格式具體過程如下: 開始前,線路處于空閑狀態(tài),送出連續(xù)“1”。傳送開始時首先發(fā)一個“0”作為起始位,然后出現(xiàn)在通信線上的是字符的二進(jìn)制編碼數(shù)據(jù)。每個字符的數(shù)據(jù)位長可以約定為5位、6位、7位或8位,一般采用ascii編碼。后面是奇偶校驗(yàn)位,根據(jù)約定,用奇偶校驗(yàn)位將所傳字符中為“1”的位數(shù)湊成奇數(shù)個或偶數(shù)個。也可以約定不要奇偶校驗(yàn),這樣就取消奇偶校驗(yàn)位。最后是表示停止位的“1”信號,這個停止位可以約定持續(xù)1 位、1。5 位或2 位的時間寬度。至此一個字符傳送完畢,線

45、路又進(jìn)入空閑,持續(xù)為“1”。經(jīng)過一段隨機(jī)時間后,下一個字符開始傳送才又發(fā)出起始位。每一個數(shù)據(jù)位的寬度等于傳送波特率的倒數(shù)。微機(jī)異步串行通信中,常用的波特率為110,150,300,600,1200,2400,4800,9600 ,115200等。程序控制流程圖如下所示:子操作完成鍵盤鼠標(biāo)的模擬,鍵盤處理程序負(fù)責(zé)接收用戶輸入的信息。各部分實(shí)現(xiàn)可下文。3.2.3 s3c44b0異步串行口控制器及相關(guān)寄存器s3c44b0自帶兩個異步串行口控制器,每個控制器有16字節(jié)的fifo(先入先出寄存器),最大波特率115。2k。每個uart有7種狀態(tài):溢出錯誤,校驗(yàn)錯誤,幀錯誤,暫停態(tài),接收緩沖區(qū)準(zhǔn)備好,發(fā)送

46、緩沖區(qū)空,發(fā)送移位緩沖器空,這些狀態(tài)可以由相應(yīng)的utrstatn或uerstatn寄存器表示,并且與發(fā)送接收緩沖區(qū)相對應(yīng)的有錯誤緩沖區(qū)。波特率的大小可以通過設(shè)置波特率寄存器(ubrdivn)控制。計(jì)算公式如下: ubrdivn = (int)(mclk/(bps x 16) ) -1,其中mclk 是系統(tǒng)頻率,在40mhz的情況下,當(dāng)波特率取115200時, ubrdivn = (int)(40000000 / (115200 x 16) + 0。5 ) 1 = 21現(xiàn)將相關(guān)寄存器名稱中英文對照列表如下:寄存器名稱英文表示線路控制寄存器ulconn 控制寄存器 uconnfifo控制寄存器uf

47、conn 控制寄存器umconn 狀態(tài)寄存器utrstat錯誤狀態(tài)寄存器uerstatfifo狀態(tài)寄存器ufstat 發(fā)送寄存器 utxh 接收寄存器urxh波特率因子寄存器ubrdiv 表1 uart相關(guān)的寄存器中英文名稱對照3.2.4 鍵盤輸入與io這部分主要是通過編寫矩陣鍵盤掃描程序,并將按鍵鍵值送往pc端應(yīng)用程序。鍵盤掃描過程就是讓微處理器按有規(guī)律的時間間隔查看鍵盤矩陣,以確定是否有鍵被按下,一旦處理器判定有一個鍵按下,鍵盤掃描軟件將過濾掉抖動并且判定哪個鍵被按下,每個鍵被分配一個稱為掃描碼的唯一標(biāo)識符。應(yīng)用程序利用該掃描碼,根據(jù)按下的鍵來判定應(yīng)該采取什么行動,換句話說,掃描碼將告訴應(yīng)

48、用程序按下哪個鍵。實(shí)現(xiàn)方法如下:1,初始化:所有的行(輸出端口)被強(qiáng)行設(shè)置為低電平2,在沒有任何鍵按下時,所有的列(輸入端口)將讀到高電平。3,任何鍵的閉合將造成其中的一列變?yōu)榈碗娖健?,一旦檢測到有鍵被按下,就需要找出是哪一個鍵。過程很簡單,微處理器只需在其中一列上輸出一個低電平。如果它在輸入端口上發(fā)現(xiàn)一個0值,微處理器就知道在所選擇行上產(chǎn)生了鍵的閉合。3.2 pc端與arm嵌入式端的串行通訊實(shí)現(xiàn)3.2.1 端與端串口通訊概紹串口通信(serial communication), 是指外設(shè)和計(jì)算機(jī)間,本設(shè)計(jì)是指jx44bo-2嵌入式系統(tǒng)與pc之間,通過串口數(shù)據(jù)信號線 、地線、控制線等,按位進(jìn)

49、行傳輸數(shù)據(jù)的一種通訊方式。這種通信方式使用的數(shù)據(jù)線少,在遠(yuǎn)距離通信中可以節(jié)約通信成本,但其傳輸速度比并行傳輸?shù)?。串行通信接口電路一般由可編程的串行接口芯片、波特率發(fā)生器、eia與ttl電平轉(zhuǎn)換器以及地址譯碼電路組成。3.2.2串口通訊工作方式由于 cpu 與接口之間按并行方式傳輸,接口與外設(shè)之間按串行方式傳輸,因此,在串行接口中,必須要有接收移位寄存器 (串并)和發(fā)送移位寄存器(并串)。 在數(shù)據(jù)輸入過程中,數(shù)據(jù)一位一位地從外設(shè)進(jìn)入接口的接收移位寄存器,當(dāng)接收移位寄存器中已接收完 1 個字符的各位后,數(shù)據(jù)就從接收移位寄存器進(jìn)入數(shù)據(jù)輸入寄存器 在數(shù)據(jù)輸出過程中,cpu 把要輸出的字符(并行地)送入

50、數(shù)據(jù)輸出寄存器,數(shù)據(jù)輸出寄存器的內(nèi)容傳輸?shù)?,發(fā)送移位寄存器,然后由發(fā)送移位寄存器移位,把數(shù)據(jù) 一 位一位地送到外設(shè)。發(fā)送移位寄存器的移位速度由發(fā)送時鐘確定。 串口通訊數(shù)據(jù)線接口引腳如下圖: 圖5 串口數(shù)據(jù)線引腳圖3.2.1 串口數(shù)據(jù)接收的vc實(shí)現(xiàn) win 32系統(tǒng)為串行通信提供了全新的服務(wù)。傳統(tǒng)的opencomm、readcomm、writecomm、closecomm等函數(shù)已經(jīng)過時,wm_commnotify消息也消失了。取而代之的是文件i/o函數(shù)提供的打開和關(guān)閉通信資源句柄及讀寫操作的基本接口。 新的文件i/o函數(shù)(createfile、readfile、writefile等)支持重疊式輸

51、入輸出,這使得線程可以從費(fèi)時的i/o操作中解放出來,從而極大地提高了程序的運(yùn)行效率。 (1) 串行口的打開和關(guān)閉 win 32系統(tǒng)把文件的概念進(jìn)行了擴(kuò)展。無論是文件、通信設(shè)備、命名管道、郵件槽、磁盤、還是控制臺,都是用api函數(shù)createfile來打開或創(chuàng)建的。該函數(shù)的聲明為: handle createfile( lpctstr lpfilename, / 文件名 dword dwdesiredaccess, / 訪問模式 dword dwsharemode, / 共享模式 lpsecurity_attributes lpsecurityattributes, / 通常為null dwor

52、d dwcreationdistribution, / 創(chuàng)建方式 dword dwflagsandattributes, / 文件屬性和標(biāo)志 handle htemplatefile / 臨時文件的句柄,通常為null ); 如果調(diào)用成功,那么該函數(shù)返回文件的句柄,如果調(diào)用失敗,則函數(shù)返回invalid_handle_value。 (2)串行口的初始化 在打開通信設(shè)備句柄后,常常需要對串行口進(jìn)行一些初始化工作。這需要通過一個dcb結(jié)構(gòu)來進(jìn)行。dcb結(jié)構(gòu)包含了諸如波特率、每個字符的數(shù)據(jù)位數(shù)、奇偶校驗(yàn)和停止位數(shù)等信息。在查詢或配置置串行口的屬性時,都要用dcb結(jié)構(gòu)來作為緩沖區(qū)。 調(diào)用getcomm

53、state函數(shù)可以獲得串口的配置,該函數(shù)把當(dāng)前配置填充到一個dcb結(jié)構(gòu)中。一般在用createfile打開串行口后,可以調(diào)用getcommstate函數(shù)來獲取串行口的初始配置。要修改串行口的配置,應(yīng)該先修改dcb結(jié)構(gòu),然后再調(diào)用setcommstate函數(shù)用指定的dcb結(jié)構(gòu)來設(shè)置串行口。 除了在dcb中的設(shè)置外,程序一般還需要設(shè)置i/o緩沖區(qū)的大小和超時。windows用i/o緩沖區(qū)來暫存串行口輸入和輸出的數(shù)據(jù),如果通信的速率較高,則應(yīng)該設(shè)置較大的緩沖區(qū)。調(diào)用setupcomm函數(shù)可以設(shè)置串行口的輸入和輸出緩沖區(qū)的大小。 在用readfile和writefile讀寫串行口時,需要考慮超時問題。

54、如果在指定的時間內(nèi)沒有讀出或?qū)懭胫付〝?shù)量的字符,那么readfile或writefile的操作就會結(jié)束。要查詢當(dāng)前的超時設(shè)置應(yīng)調(diào)用getcommtimeouts函數(shù),該函數(shù)會填充一個commtimeouts結(jié)構(gòu)。調(diào)用setcommtimeouts可以用某一個commtimeouts結(jié)構(gòu)的內(nèi)容來設(shè)置超時。 commtimeouts結(jié)構(gòu)如下: typedef struct _commtimeouts dword readintervaltimeout; / 讀間隔超時 dword readtotaltimeoutmultiplier; / 讀時間系數(shù) dword readtotaltimeoutconstant; / 讀時間常量 dword writetotaltimeoutmultiplier; / 寫時間系數(shù) dword writetotaltime

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論