《Windows CE 应用与编程.pdf》由会员分享,可在线阅读,更多相关《Windows CE 应用与编程.pdf(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Windows CE 应用与编程应用与编程 1 Windows CE嵌入式操作系统简介 Windows CE 简介 Microsoft Windows CE 是一个为多种嵌入式系统和产品而设计的紧凑、高效、可升级的操作系统,并特别为有限的硬件资源设计了多线程、多任务和完全优先的操作系统环境。其模块化设计使嵌入式系统开发者和应用程序开发者能够根据多种不同产品进行定制,例如,用户电子设备、专用工业控制器以及嵌入式通信设备。有关所支持芯片的最新信息,请访问Windows CE 的站点 http:/ Windows CE 支持多种外围硬件、设备和网络系统,包括键盘、鼠标、触摸屏、串行端口、以太网连接、
2、调制解调器、通用串行总线(USB)设备、音频设备、并行端口、打印机设备和存储设备(例如PCMCIA卡)。而且,Windows CE 支持可用来开发应用程序的 1000 多个通用的Microsoft Win32 API 和多个附加的程序接口。这些接口包括:Component Object Model(COM)Microsoft Foundation Classes(MFC)Microsoft ActiveX 控件 Microsoft Active Template Library(ATL)此外,Windows CE 还支持下列技术:为限时响应的应用提供实时控制 包括 USB 支持在内的多种串行和
3、网络通信技术 为Windows CE 用户提供互联网服务的移动频道 进程间通信的自动化和其它方法 作为桌面电脑延伸的设备,为使用户在桌面电脑与基于Windows CE 的设备之间管理和传输数据,Windows CE 提供了如下工具:用于建立并维护连接的连接管理器 用于同步共享数据的数据同步接口 用于导入和导出文件的文件过滤器 用于桌面电脑用户申请服务(如从基于Windows CE 的附属设备进行文件处理)的远程应用程序接口(PAPI)用于从附属的桌面电脑或其它来源上安装和卸载Windows CE 应用程序的应用程序安装和管理服务 总而言之,Windows CE 具有足够的改进性能和灵活性能,可
4、用于多种小型嵌入式系统,而且完全能够胜任最新式的高性能工业及用户设备的要求。2 Windows CE应用程序开发 开发步骤:1、新建工程 2、联机调试 3、编写应用程序 4、下装 5、运行 NOTES:联机调试的方法 联机调试可通过串口或以太网,进行调试时,您只能选择其一。如果平台支持以太网,请选择以太网联接。因为以太网联接速度更快。另外,如果您在支持以太网的平台上使用串口调试程序,容易导致通讯冲突或通讯不稳定。如果平台不支持以太网,请选择串口连接。由于研华公司提供的Windows CE 设备均带有以太网接口,因此我们仅以以太网联接为例讲解联机调试的方法 2.1 用以太网联机调试 一:网络配置
5、 请按以下步骤进行:1.进入Control Panel Communications 选项.2.将默认的计算机名WinCE 改为其他名字.注意:请选择网络中独一无二的计算机名。.3.然后,您可以改变网络及TCP/IP设置。(进入Control Panel Network)默认的IP地址设置是由DHCP自动分配.您可以将其改变为固定IP.4.运行regsave.exe保存已完成的设置。5.重新启动 6.注意:此时通过局域网,WinCE可访问其他Windows9595nt2000上的共享文件,但WinCE上的文件不能被其它计算机访问。网络命令 网络命令使您能够访问Windows95/98/NT/2
6、000.上的文件 帮助信息可由以下命令获得:net/?net view|/DOMAIN:net use|*/user:/d Example:net view MyServerMyShareDirectory cd“My ServerMy Document”cd MyServerMyShareDirectory 二以太网联接:1.将开发程序用的主机和WindowsCE设备连入同一局域网中。(请确定它们都有唯一的ip地址)2.运行eMbedded Visual C+.net 3.运行Tools “Configure Platform Manager”4.选择正确的SDK(e.g.Advantech
7、_X86)5.点击“Properties”6.选择“TCP/IP Transport for Windows CE”7.点击“Configure”8.选择“Fixed Port”并按“OK”按钮 9.按“Advanced”按钮 10.选择“Manual Server”并按“OK”按钮 11.按“Test”按钮测试连接 12.当显示如下的对话框时将命令行记录在纸上(注意:每一次连接命令行会有所不同).点击OK.13.在WinCE的命令提示符后输入以上命令并回车。如果连接正常,会在下一行出现一个闪动的黑色光标。14.一旦连接建立,您就可以通过已建立的连接下装并调试应用程序,除非编写程序的主机中该应
8、用程序的调试关闭或Windows CE设备重新启动,该连接将一直保持。2.2 eVC 程序开发基本方法:1、Win32 程序开发 这个例子将告诉您如何开发一个简单的Win32 Hello World 应用程序 运行eMbedded Visual C+.net.File菜单中的New,选择Projects 选项卡,并从中选择WCE Application.然后键入工程的名字HelloW32,选择工程的路径.同时还要选择开发平台(SDK)(e.g.Win32(WCE x86)and Win32(WCE x86em).点击OK.接下来会弹出WCE Application-Step 1 of 1窗口。
9、在其中选择A typical HelloWorld application 并点击Finish.这将产生一个新的Win32 应用程序及其细节。这如你所知,你可以在左半部分的区域(叫做Workspace)看到工程中所有文件的列表。从Build菜单中选择Build HelloW32.exe。整个工程文件将在数分钟之后被编译成可执行文件,并通过刚才建立的串口或以太网联接被拷贝到目标Windows CE设备中 2、MFC 程序开发 这个例子介绍了如何开发一个简单的MFC应用程序。运行eMbedded Visual C+4.0.从File菜单中选择New,选择Projects 选项卡并选择WCE MFC
10、 AppWizard(exe).键入工程名称HelloMFC,并选择工程路径。接下来选择开发平台SDK(e.g.Win32(WCE x86)and Win32(WCE x86em).点击OK.您可以在向导中采用默认的设置直到最后点击Finish.从Build 菜单中选择Build HelloMFC.exe.整个工程文件将在数分钟之后被编译成可执行文件,并通过刚才建立的串口或以太网联接被拷贝到目标Windows CE设备中 3 eVC源程序讲解 前言:在本章中,我们重点介绍研华UNO-2050平台下,利用API函数进行编程,控制硬件设备的方法。第一部分是对UNO-2050板载的D I/O,Cou
11、nter,以及声光指示的操控方法。针对这一部分功能,研华提供了“ADS2050.DLL”动态链接库,其中包含了一系列能对硬件设备进行底层进行I/O操作的函数。为什么要使用动态链接库呢?动态链接库是一种基于Windows的程序模块,它是在运行时刻被装入和链接的。动态链接库中只包含供应用程序运行时装入该DLL的有关信息,并非是源代码的复制,因此使用动态链接库可以使多个应用程序之间共享代码和资源从而提高运行速率。在前面的章节中,我们已经了解了如何利用eMbedded Visual C+4.0进行应用程序的开发,在这一部分编程中,应注意将ADS2050.h和ADS2050.lib添加到工程中,否则动态
12、连接库中的函数将不能被正常使用。为方便阅读程序,下面对两个关键的DLL函数进行简单的说明:1)DRV_DeviceOpen()。该函数必须最先被调用,他加载一个设备驱动程序到内存,并确定设备的类型,完成对设备的初始化,使设备做好I/O的准备工作,同时返回一个函数值。若设备驱动成功返回非“0”的设备句柄,若设备驱动失败则返回“0”。2)DRV_DeviceClose()。该函数是关闭由DRV_DeviceOpen()打开的设备,它的函数参数是由DRV_DeviceOpen()函数返回的设备句柄,若设备关闭成功返回非“0”值,否则返回“0”。EX1:数字量输入输出控制 请参考DIGIN和DIGOU
13、T两个例程。在这两个程序中你可以了解到如何操作UNO-2050控制器中的数字量输入输出端口,练习基本的I/O操作。DIGIN:操作步骤:#include stdafx.h#include.includeADS2050.h void ErrorHandler(LONG lDrvHandle,DWORD dwErrCde,BOOL bClose);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)DWORD dwErrCde;ULONG lDevNum;LONG
14、lDriverHandle;USHORT usState;int i;/Step 1:Display hardware and software settings for running this example printf(Digital input via port output and bit number.nn);/Step 2:If the On board I/O,its device number is zero.lDevNum=0;/Step 3:Open device dwErrCde=DeviceOpen(lDevNum,&lDriverHandle);if(dwErrC
15、de!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,FALSE);exit(1);/Step 4:Read state from the specified channel dwErrCde=DioReadPortByte(lDriverHandle,0,&usState);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);return 0;printf(nReading data via port=0 x%xnn,usState);/Step 5:Read State fr
16、om each bit from 0 to 7 for(i=0;i=7;i+)dwErrCde=DioReadBit(lDriverHandle,0,i,&usState);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);return 0;printf(Reading data via bits(Bit%d)=0 x%1Xn,i,usState);/Step 6:Close device dwErrCde=DeviceClose(&lDriverHandle);printf(nPress any key to exi
17、t.);getchar();return 0;/*Function:ErrorHandler *Show the error message for the corresponding error code *input:lDrvHandle,dwErrCde,bClose *return:none */void ErrorHandler(LONG lDrvHandle,DWORD dwErrCde,BOOL bClose)TCHAR szErrMsg180;char szAnsiMsg180;if(bClose)DeviceClose(&lDrvHandle);GetErrorMessage
18、(dwErrCde,szErrMsg);/Convert wide char to ansi char WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,szErrMsg,-1,szAnsiMsg,180,NULL,NULL);printf(nError(%d):%sn,dwErrCde&0 xffff,szAnsiMsg);printf(Program terminated!n);printf(Press any key to exit.);getchar();getchar();DIGOUT:操作步骤:#include stdafx.h#includ
19、e.includeADS2050.h void ErrorHandler(LONG lDrvHandle,DWORD dwErrCde,BOOL bClose);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)DWORD dwErrCde;ULONG lDevNum;LONG lDriverHandle;USHORT usState;int i;/Step 1:Display hardware and software settings for runnin
20、g this example printf(Digital output via port output and bit number.nn);/Step 2:If the On board I/O,its device number is zero.lDevNum=0;/Step 3:Open device dwErrCde=DeviceOpen(lDevNum,&lDriverHandle);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,FALSE);exit(1);/Step 3:Read back the curren
21、t DO value dwErrCde=DioGetCurrentDOByte(lDriverHandle,0,&usState);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);return 0;printf(nGet current DO via port=0 x%xn,usState);/Step 4:Read State from each bit from 0 to 7 for(i=0;i=7;i+)dwErrCde=DioGetCurrentDOBit(lDriverHandle,0,i,&usState
22、);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);return 0;printf(Get current DO via bits(Bit%d)=0 x%1Xn,i,usState);printf(nPrepare to write data,press any key to continue.nn);getchar();/Step 5:Prepare the write value 0 x00 and 0 xff dwErrCde=DioWritePortByte(lDriverHandle,0,0 xff,0 x
23、00);printf(nWrite port value to 0 x00,press any key to continue.n);getchar();dwErrCde=DioWritePortByte(lDriverHandle,0,0 xff,0 xff);printf(nWrite port value to 0 xff,press any key to continue.n);getchar();/Step 6:Read State from each bit from 0 to 7 for(i=0;i counter channel:);scanf(%d,&nChan);/Step
24、 5:Reset counter by CounterReset function dwErrCde=CounterReset(lDriverHandle,nChan);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step 6:config clock pin,gate pin and out pin direction /ClockPin=CFG_CLOCK_INTERNAL or CFG_CLOCK_EXTERNAL /GatePin=CFG_GATE_INTERNAL or CFG_GAT
25、E_EXTERNAL /OutPin =CFG_OUTPIN_TO_DO or CFG_OUTPIN_NON_DO dwErrCde=CounterConfig(lDriverHandle,nChan,CFG_CLOCK_EXTERNAL,CFG_GATE_INTERNAL,CFG_OUTPIN_NON_DO);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step 7:Start counter operation by CounterEventStart /-CTRGate =CFG_CTR_
26、START or CFG_CTR_STOP;/internal control to start or stop dwErrCde=CounterEventStart(lDriverHandle,nChan,CFG_CTR_START);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step 8:Read counter value by CounterEventRead in while loop /and display counter value,exit when pressing any
27、 key while(lDriverHandle)dwErrCde=CounterEventRead(lDriverHandle,nChan,&wOverflow,&dwReading);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);printf(nCounter value=%lu,press Q,the system will exit.,dwReading);nKey=getchar();if(nKey=Q)break;/Step 9:Stop counter by CounterReset
28、dwErrCde=CounterReset(lDriverHandle,nChan);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step 10:Close device dwErrCde=DeviceClose(&lDriverHandle);return 0;/*Function:ErrorHandler *Show the error message for the corresponding error code *input:lDrvHandle,dwErrCde,bClose *re
29、turn:none */void ErrorHandler(LONG lDrvHandle,DWORD dwErrCde,BOOL bClose)TCHAR szErrMsg180;char szAnsiMsg180;if(bClose)DeviceClose(&lDrvHandle);GetErrorMessage(dwErrCde,szErrMsg);/Convert wide char to ansi char WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,szErrMsg,-1,szAnsiMsg,180,NULL,NULL);printf(
30、nError(%d):%sn,dwErrCde&0 xffff,szAnsiMsg);printf(Program terminated!n);printf(Press any key to exit.);getchar();getchar();FREQ:操作步骤:#include stdafx.h#include.includeADS2050.h void ErrorHandler(LONG lDrvHandle,DWORD dwErrCde,BOOL bClose);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
31、,LPTSTR lpCmdLine,int nCmdShow)DWORD dwErrCde;ULONG lDevNum;long lDriverHandle;int nChan,nKey;float fFreq=0.0;/Step 1:Display hardware and software settings for running this example printf(Frequence measure function testing.nn);/Step 2:If the On board I/O,its device number is zero.lDevNum=0;/Step 3:
32、Open device dwErrCde=DeviceOpen(lDevNum,&lDriverHandle);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,FALSE);exit(1);/input channel,that only support 0 or 1 printf(nPlease input parameters-counter channel:);scanf(%d,&nChan);/Step 4:Reset counter by CounterReset dwErrCde=CounterReset(lDriv
33、erHandle,nChan);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/config clock pin,gate pin and out pin direction /ClockPin=CFG_CLOCK_INTERNAL or CFG_CLOCK_EXTERNAL /GatePin=CFG_GATE_INTERNAL or CFG_GATE_EXTERNAL /OutPin =CFG_OUTPIN_TO_DO or CFG_OUTPIN_NON_DO dwErrCde=CounterCo
34、nfig(lDriverHandle,nChan,CFG_CLOCK_EXTERNAL,CFG_GATE_INTERNAL,CFG_OUTPIN_TO_DO);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step 5:Start frequency measurement operation by CounterFreqStart /-CTRGate =CFG_CTR_START or CFG_CTR_STOP;/internal control to start or stop printf(
35、nFrequency measurement starts.(GatePeriod=0,CTRGate=CFG_CTR_START);dwErrCde=CounterFreqStart(lDriverHandle,nChan,0,CFG_CTR_START);if(dwErrCde!=SUCCESS)printf(n CounterFreqStart Error.);ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);Sleep(5);/Waiting sometime start to read freqs value /Step 6:Read
36、 counter value by CounterFreqRead in while loop /and display counter value,exit when pressing any key while(lDriverHandle)dwErrCde=CounterFreqRead(lDriverHandle,nChan,&fFreq);if(dwErrCde!=SUCCESS)printf(n CounterFreqRead Error.%d Hz.),dwErrCde);ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);print
37、f(nFrequcney=%f Hz,press Q,the system will exit.,fFreq);nKey=getchar();if(nKey=Q)break;getchar();/Step 7:Stop counter by CounterReset dwErrCde=CounterReset(lDriverHandle,nChan);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step 8:Close device dwErrCde=DeviceClose(&lDriverHa
38、ndle);return 0;/*Function:ErrorHandler *Show the error message for the corresponding error code *input:lDrvHandle,dwErrCde,bClose *return:none */void ErrorHandler(LONG lDrvHandle,DWORD dwErrCde,BOOL bClose)TCHAR szErrMsg180;char szAnsiMsg180;if(bClose)DeviceClose(&lDrvHandle);GetErrorMessage(dwErrCd
39、e,szErrMsg);/Convert wide char to ansi char WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,szErrMsg,-1,szAnsiMsg,180,NULL,NULL);printf(nError(%d):%sn,dwErrCde&0 xffff,szAnsiMsg);printf(Program terminated!n);printf(Press any key to exit.);getchar();getchar();EX4:定时中断 请参考例程TIMER。我们在EX2 中断控制中曾经学习过使用外部脉冲触
40、发中断的方法,例程TIMER是一个用内部时钟触发中断的例子,在这种方式下,系统直接使用板载的82C54芯片产生的脉冲作为中断源,用户可以设置多少个脉冲之后产生中断。例如,我们设置脉冲的频率为100KHZ,当脉冲个数为0XFFFF(也就是十进制的65535)产生一次中断。那么,用65535除以100K就可以得到,系统每隔655ms就产生一次中断。TIMER:操作步骤:#include stdafx.h#include.includeADS2050.h static void UserThread();void ErrorHandler(LONG lDrvHandle,DWORD dwErrCde
41、,BOOL bClose);HANDLE hCloseEvent,hCNTAEvent,hCNTBEvent,hStopThreadAck;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)DWORD dwErrCde;ULONG lDevNum;int usChan,nTimeBase;LONG lDriverHandle;USHORT nEventType;HANDLE hThread;DWORD dwThreadID;在这个流程图中,同样要先打开设备,然
42、后调 用 CounterReset()把 计 数 器 置 为 0。CounterClockConfig()函数的作用是设置内部脉冲的时基,其实就是设置用来触发中断的脉冲频率。接下来调用EventEnable()将事件使能。在这个函数中,还可以设置要使能的事件类型。在CounterTimerStart()函数中,主要设置多少个脉冲之后触发一次事件。当脉冲个数到达时,预先设置的事件就会发生。这样,就可以利用UNO-2050的内部脉冲来精确定时了。ULONG ulHardwareCounter;USHORT nTimeBaseHW;/Step 1:Display hardware and softw
43、are settings for running this example printf(Timer interrupt with interrupt function testing.nn);/Step 2:If the On board I/O,its device number is zero.lDevNum=0;/Step 3:Open device dwErrCde=DeviceOpen(lDevNum,&lDriverHandle);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,FALSE);exit(1);/St
44、ep 4:choose which channel do you want to use printf(nPlease input parameters-counter channel:);scanf(%d,&usChan);/Step 5:Reset counter by CounterReset function dwErrCde=CounterReset(lDriverHandle,usChan);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step 6:Config counter(it
45、ems:time base chosing)printf(nPlease input the time base mode:);printf(n(0)TIME BASE=100K);printf(n(1)TIME BASE=10K );printf(n(2)TIME BASE=1K );printf(n(3)TIME BASE=100 n);scanf(%d,&nTimeBase);/make sure the input is from 0 to 3 if(nTimeBase=0)nTimeBaseHW=TIME_BASE_100K;if(nTimeBase=1)nTimeBaseHW=TI
46、ME_BASE_10K;if(nTimeBase=2)nTimeBaseHW=TIME_BASE_1K;if(nTimeBase=3)nTimeBaseHW=TIME_BASE_100;/Step7:call function for config counter dwErrCde=CounterClockConfig(lDriverHandle,nTimeBaseHW);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step8:create event object hCNTAEvent =Cr
47、eateEvent(NULL,FALSE,FALSE,EVENT_NAME_COUNTER0);hCNTBEvent =CreateEvent(NULL,FALSE,FALSE,EVENT_NAME_COUNTER1);hCloseEvent =CreateEvent(NULL,FALSE,FALSE,NULL);hStopThreadAck=CreateEvent(NULL,FALSE,FALSE,NULL);/Step9:create a thread hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)UserThread,0,0,&d
48、wThreadID);/Step10:enable and start the event function nEventType=ADS_EVT_CONT0|ADS_EVT_CONT1;if(EventEnable(lDriverHandle,nEventType,1,1)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step 11:Start counter operation by CounterEventStart ulHardwareCounter=0 xffff;/for internal clock=100K dwErrCd
49、e=CounterTimerStart(lDriverHandle,usChan,ulHardwareCounter);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step 12:exit while pressing any key printf(nWait a moment,the single will be generated!);printf(nPress any key to exit.n);getchar();getchar();/Step 13:disable and close
50、 the event function nEventType=ADS_EVT_CONT0|ADS_EVT_CONT1;if(EventEnable(lDriverHandle,nEventType,0,1)ErrorHandler(lDriverHandle,dwErrCde,TRUE);exit(1);/Step 14:Stop counter by CounterReset dwErrCde=CounterReset(lDriverHandle,usChan);if(dwErrCde!=SUCCESS)ErrorHandler(lDriverHandle,dwErrCde,TRUE);ex