Download presentation
Presentation is loading. Please wait.
Published byHengki Budiaman Modified 5年之前
1
2019/2/17 Windows CE 应用程序开发 艾博唯科技 Ableway Technology Co. Ltd.
2
Microsoft Windows CE 特性
支持的Win32函数是Win32函数的子集 能量的支持 WinCE的存储 GWES
3
移植到Windows CE注意事项 硬件设计特性和函数 Win32API以及扩展API 用户界面 Unicode环境 数据库文件 测试和调试
4
管理Windows CE的存储器 可用存储器的数量与设备有关 在你的Windows CE应用程序中减少存储器和大容量存储介质的使用。
减少临时文件的使用 简化或消除位图图象的使用 用运行速度换存储空间 WM_HIBERNATE消息
5
管理可用的能量 能量来源有限 要避免代码中对CPU周期不必要的使用,如PeekMessage函数 应用程序应具备对电池电量不足的处理
6
Window CE中的MFC 紧密遵循标准MFC的功能和特性,但大部分功能有所简化
提供某些专用于Windows CE的特性,如Command-Bar控制类 不支持多窗口MDI
7
ATL创建COM服务器 支持COM/OLE Automation以及其它进程间通信的高级方法 COM仅支持进程内服务器DLL
线程模式仅支持Free模式
8
RAPI Rapi概念 Rapi调用步骤 远程应用程序编程接口 初始化RAPI: CeRapiInit, CeRapiInitEx
执行程序: CeCreateProcess, CeRapiInvoke 终止RAPI: CeRapiUninit
9
RAPI(续) RAPI错误处理 获取Rapi错误: CeRapiError 获取非Rapi错误:CeGetLastError
10
移植应用程序到Windows CE的一个系统化方法
检查应用程序中所有的API引用-包括函数、消息和相关数据类型-然后更改或替换掉不与Windows CE API 兼容的引用。下面是一些检查的例子: 根本不支持的一些Win32函数-不支持任何16位Windows函数。如果存在替代函数,使用替代函数替换这些函数。否则,创建一个替代函数。例如,MoveTo和LineTo绘图函数在Windows CE中已不再被支持。其替代品是PolyLine函数。
11
移植应用程序到Windows CE的一个系统化方法(续一)
已被Windows CE等效函数取代的一些Win32函数。例如,工具和菜单条已合成为一个单一的Command Bar,并具有新的API。 支持一些Win32函数,但有限制。一些函数的一个或多个参数已不再使用。其它函数可能其参数的选择范围已减小。例如,虽然支持CreateWindow和CreateWindowEx函数,但Windows CE只支持Win32窗口风格的一个子集。
12
移植应用程序到Windows CE的一个系统化方法(续二)
支持的数据类型可能需要更改。Windows CE支持所有必要的Win32结构,但一些可能不再使用。而其它结构可能不会接受所有的选项。 不支持一些消息-包括许多WM_*和EM_*消息。一些支持的消息也已被更改。例如,wParam 或 lParam 内容可能不同。一些Windows CE的特定消息被添加进来-比如,WM_HIBERNATE。
13
用户界面 支持有限的Win32GDI 目标设备的屏幕尺寸和纵横比不同 可用的调色板非常有限 确保位图和图标具有目标设备上的正确格式
窗口和对话框的风格有限
14
使用Unicode Windows CE是一种Unicode环境-它支持ASCII函数以实现文本文件的交换,但其原有的文本格式是Unicode。将ASCII应用程序转换为Unicode程序的一些通用指导方针包括: 包含Tchar.h文件。该文件包含所有必要的转换。 使用Win32字符串函数(例如lstrlen)而不是C运行时态(run-time)库的函数。 声明中使用TCHAR、LPTSTR和其它类型。这样代码将易于编译为ASCII或Unicode格式。
15
使用Unicode (续) 使用TEXT宏进行字符串映射(例如TEXT("Your Text"))。
牢记一个字符在长度上不再是一个字节,而字符串以两个零而不是一个零结尾。 当增加一个数组指针或字符记数时,使用sizeof(TCHAR) 以确保能够对ASCII或Unicode都有效。
16
支持Windows CE通信 Windows CE支持四种通信APIs: 这四种通信APIs是相应Win32 APIs的子集。
Windows Sockets (Winsock) 电话应用程序编程接口 (TAPI) Remote Access Server (RAS,远程访问服务器) 串行通信 这四种通信APIs是相应Win32 APIs的子集。
17
支持Winsock Windows CE网络栈支持TCP/IP协议。如果你的程序使用Winsock调用处理网络传输,可能会需要进行一些改动。
IrDA规范也可通过Winsock附件来使用。但是,在Winsock中有一些限制。 WSA函数只得到了部分的支持。你将需要仔细检查对WSA函数的使用以确定是否需要进行改动。
18
支持TAPI Windows CE操作系统实现了TAPI 2.0版的要求。
19
支持RAS RAS是一个用于连接远程设备(RAS客户端)和主机PC(RAS服务器)的基于软件的多协议路由器。RAS应用程序通常在客户端设备上执行。 Windows CE支持许多标准Win32 RAS函数,不过它一次只能实现一个点对点连接。该连接可以是直接串行连接或modem拨号连接。
20
支持串行通信 对于串行口通信,Windows CE支持Win32串行函数和标准文件系统函数。这些函数可用于打开、关闭和操作串行通信端口,并能够对这些端口进行读取和写入。 Windows CE不支持交替式通信操作,但能够实现在一个设备上的多未决读/写操作。
21
ADOCE ADOCE 是一种能与 Windows CE Toolkits for Visual Basic 一同使用的应用程序级数据访问对象模型。 ADOCE 能够启动对存储于本地设备中的数据库的访问功能,并为网络数据库中的数据提供复制和同步功能,从而在 Windows CE 中增加了新的数据库功能。 ADOCE 使用简单、速度高、内存占用少、磁盘占地面积少,很适合与结构紧凑、功能强大、运行快速的 Windows CE 操作系统一同使用。
22
ADOCE(续) ADOCE 提供了下述功能: 自动实现对台式主机的双向同步。
新的数据类型:双精度型和布尔型(与 Windows CE 数据库相比较)。 对 SQL 的支持。ADOCE 中的高级 SQL 支持功能是“美国国家标准委员会 (ANSI)”的 SQL 的一个子集。它所新增的数据库引擎功能可以提供字段名、多个排序关键字、较为复杂的筛选功能、表和索引的创建功能、删除和编辑功能以及多个表的联接功能。 熟悉的 recordset.fieldname 访问方式。
23
最小化使用注册表 小心使用Windows CE注册表(registry)以保持最少的存储器需求和最大的访问速度。通过下面的指导方针使注册表项尽可能简单: 限制每个项(key)名称组件的长度。 限制得到一个值的所需项的数目。 不要使用NULL (默认)值名。 不要使用许多较小的项值;应使用一个较大的项值。 不要只是为了保持一致性而使用Windows 95的项命名约定。通常这不是最有效的方法。 保持项值尽可能的小-不要在注册表中设置数千字节的项值。
24
建立开发调试环境 硬件 软件 PII400,128MB,40G,10/100LAN
Windows2000/XP,Visual Studio 6.0,MS SQL2000,WinCE SDK,eMbedded Visual C++
25
实验一:使用EVC++ 4.0 安装EVC++ 4.0 安装SDK 编制应用程序helloworld.exe
26
用向导创建程序 1. 启动 eVC++ v4.0. 2. 在菜单的File 选项中, 选择 New.
3. 在Projects tab中, 选择 WCE Application. 4. 工程名称取名Hello. 5. 在CPU列表中, 选择x86. 6.点OK. 7.选择“A typical Hello World application”,然后点Finish。 8.在 New Project Information窗口中点OK.
27
用向导创建程序
28
用向导创建程序
29
编译运行程序 1. 在工具条上, 在 Active WCE Configuration 列表中,选择正确的SDK。
30
编译运行程序 2. 在工具条的Set Active Configuration选择框中, 选择 Win32 (WCE x86) Debug.
31
编译运行程序 3. 可以修改代码
32
编译运行程序 4. 在Build菜单项里, 选择Build Hello.exe. eVC++ 需要设置 Platform Manager来保证程序能够下载到目标设备运行 a. 在 Tools 菜单项里, 选择Configure Platform Manager. b. 展开树,选择正确的目标设备. c.点属性按钮,确认传输方式是TCP/IP,并且 Startup Server 是Manual Server. d. 点 Transport 中的Configure… 按钮. e. 选中Fixed Port 项, 然后点 OK. f. 点 OK 保存设置
33
编译运行程序
34
编译运行程序 5. 选菜单项 Build中的Execute Hello.exe。EVC会提示你在目标设备上运行CEMGRC.EXE.这时候不要点OK。 6.在目标设备上,运行 CMD.exe 来打开一个控制窗口. 7.在控制窗口中执行cemgrc /S /T:TCPIPC.DLL /Q /D: :5000,其中 应该是你开发主机的IP地址。 8.在主机的提示运行CEMGRC.EXE的对话框中点OK,程序就会下载到目标设备上运行了。
35
编译运行程序
36
实验二:使用VS.net 2003 安装Visual Studio.net 2003 安装Compact Framework 1.1
安装Windows CE .NET Utilities v1.1 for Visual Studio .NET 2003 编制应用程序helloworld.exe
37
用向导创建程序 1. 启动 VS.net 2003. 2. 在菜单的File 选项中, 选择 New->Project.
3. 在Visual Basic项目中, 选择智能设备应用程序. 4. 工程名称取名MyHelloWorld. 5. 在平台列表中, 选择Windows CE,项目类型选择Windows 应用程序. 6.点OK.
38
用向导创建程序
39
编译运行程序 1. 在窗体上编写自己的代码。
40
编译运行程序 2. 在Tools->Options->Device Tools->Devices菜单中设置好相关参数。
41
编译运行程序 3. 在目标设备上执行SDAuthUtilDevice.exe,并点Start。
42
编译运行程序 4. 在开发机上执行Tools->Smart Devices Authentication Utility,并输入设备IP。确定后有成功的提示。
43
编译运行程序 5.在菜单上选择Debug->Start,或者直接按F5,选择所要连接设备类型。
44
编译运行程序 6. VS.NET 2003会自动连接到设备,并且将.NET Compact Framework及所要调适的程序部署在设备内存中。部署完成后自动运行应用程序。
45
A Q & Q U E S T I O N S A N S W E R S
46
2019/2/17 Windows CE 串口通讯编程 艾博唯科技 Ableway Technology Co. Ltd.
47
串行协议和OSI模型 应用层 应用程序 表示层 会话层 传输层 网络层 串行API 数据链路层 串行设备驱动程序 物理层 串行口 IR端口
48
串行通信概要 用于串行通信的函数和结构在Winbase.h头文件中定义 交换数据方式类似文件读写
函数可以用于打开、关闭和操作串行口,传送和接收数据,以及管理连接等。 可以使用点对点协议(PPP)和串行线路Internet协议(SLIP)实现串行连接和拨号连接
49
串行通信函数(一) CreatFile GetCommStat SetCommStat GetCommTimeouts 打开串行端口
用指定通信设备的当前控制设置填充设备控制块(DCB结构) SetCommStat 按照DCB结构的说明配置通信设备。这个函数重新初始化所有硬件和控制设备,但不清空I/O队列 GetCommTimeouts 获得指定通信设备上所有读/写操作的超时参数
50
串行通信函数(二) SetCommTimeouts WriteFile ReadFile SetCommMask GetCommMask
设置指定通信设备上所有读/写操作的超时参数 WriteFile 向串口写数据 ReadFile 从串口读数据 SetCommMask 指定为通信设备监视的一组事件 GetCommMask 获得指定通讯设备的时间掩码值
51
串行通信函数(三) WaitCommEvent EscapeCommFunction ClearCommBreak
等待指定通信设备的事件的发生。事件包含在与设备句柄相关联的事件掩码中 EscapeCommFunction 指定通信设备执行扩展功能,通常用于将串口设置为IR模式 ClearCommBreak 恢复指定通信设备的字符传输,并设置传输线路为不可中断状态 ClearCommError 获得通信错误数据,并报告指定通信设备的当前状态
52
串行通信编程(一) 打开串行口 // Open the serial port.
hPort = CreateFile (lpszPortName, // Pointer to the name of the port GENERIC_READ | GENERIC_WRITE, // Access (read-write) mode 0, // Share mode NULL, // Pointer to the security attribute OPEN_EXISTING,// How to open the serial port 0, // Port attributes NULL); // Handle to port with attribute // to copy
53
串行通信编程(二) 配置串行口 // Change the DCB structure settings.
PortDCB.BaudRate = 9600; // Current baud PortDCB.fBinary = TRUE; // Binary mode; no EOF check PortDCB.fParity = TRUE; // Enable parity checking PortDCB.fOutxCtsFlow = FALSE; // No CTS output flow control PortDCB.fOutxDsrFlow = FALSE; // No DSR output flow control PortDCB.fDtrControl = DTR_CONTROL_ENABLE; // DTR flow control type PortDCB.fDsrSensitivity = FALSE; // DSR sensitivity PortDCB.fTXContinueOnXoff = TRUE; // XOFF continues Tx PortDCB.fOutX = FALSE; // No XON/XOFF out flow control PortDCB.fInX = FALSE; // No XON/XOFF in flow control PortDCB.fErrorChar = FALSE; // Disable error replacement PortDCB.fNull = FALSE; // Disable null stripping PortDCB.fRtsControl = RTS_CONTROL_ENABLE; // RTS flow control PortDCB.fAbortOnError = FALSE; // Do not abort reads/writes on // error PortDCB.ByteSize = 8; // Number of bits/byte, 4-8 PortDCB.Parity = NOPARITY; // 0-4=no,odd,even,mark,space PortDCB.StopBits = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2
54
串行通信编程(三) 配置超时值 每次打开串口时都必须用COMMTIMEOUTS结构设置通信超时值。如果不配置,则使用驱动程序的缺省超时值,或者上一个程序的值。 // Change the COMMTIMEOUTS structure settings. CommTimeouts.ReadIntervalTimeout = MAXDWORD; CommTimeouts.ReadTotalTimeoutMultiplier = 0; CommTimeouts.ReadTotalTimeoutConstant = 0; CommTimeouts.WriteTotalTimeoutMultiplier = 10; CommTimeouts.WriteTotalTimeoutConstant = 1000;
55
串行通信编程(四) 写端口 由于Windows CE不支持异步I/O,所以主线程不应该试图向串口写大量数据,这样容易导致线程租塞。应用程序可以通过创建多个线程处理读/写操作以模拟异步I/O。为了协调多个线程,可以调用WaitCommEvent函数,直至发生特定的通信事件。 WriteFile (hPort, // Port handle &Byte, // Pointer to the data to write 1, // Number of bytes to write &dwNumBytesWritten, // Pointer to the number of bytes // written NULL)) // Must be NULL for Windows CE
56
串行通信编程(五) 读端口 通常情况下,读操作是一个独立的线程,它总是随时准备处理达到串口的数据。通信事件通知读线程有数据可读。读线程通常一次读一个字节,直至读完所有字节,然后等待下一个通信事件。 // Read the data from the serial port. ReadFile (hPort, //Port handle &Byte, //Pointer to data to read 1, //Number of bytes to read &dwBytesTransferred, //Pointer to number of bytes read NULL //Must be NULL for Windows CE );
57
串行通信编程(六) 使用通信事件 通信事件是当发生重要事件时Windows CE向应用程序发送的通知。应用程序可以用WaitCommEvent函数阻塞线程,直至特定事件发生。用SetCommMask函数可以指定继续处理前必须发生的事件。如果指定了多个事件,则任何一个事件的发生将导致WaitCommEvent函数返回。 这种机制使应用程序能够知道数据何时到达串行口。通过等待表示数据到达的通信事件,应用程序可以避免因调用ReadFile函数等待数据到达而阻塞串行口。只有当数据可读时才应该调用ReadFile函数。
58
串行通信编程(六) 使用通信事件 // Specify a set of events to be monitored for the port. SetCommMask (hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_RING); while (hPort != INVALID_HANDLE_VALUE) { // Wait for an event to occur for the port. WaitCommEvent (hPort, &dwCommModemStatus, 0); // Re-specify the set of events to be monitored for the port. SetCommMask (hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RING); if (dwCommModemStatus & EV_RXCHAR) // Loop for waiting for the data. do // Read the data from the serial port. ReadFile (hPort, &Byte, 1, &dwBytesTransferred, NULL ); } while (dwBytesTransferred == 1); }
59
串行通信编程(七) 关闭串口 if (hCommPort != INVALID_HANDLE_VALUE) {
// Close the communication port. if (!CloseHandle (hCommPort)) dwError = GetLastError (); return FALSE; } else hCommPort = INVALID_HANDLE_VALUE; return TRUE;
60
注意事项(一) Windows CE是一个基于Unicode的操作系统
Windows CE不支持Windows下常用的串行通信重叠I/O方式(OVERLAPPED)。但是串行口驱动程序可以使多线程同时访问串行口(即一个线程被ReadFile()调用阻塞的同时另一个线程可以调用WriteFile())。 不要使用相对路径。与Windows 2000不一样,Windows CE没有当前目录这个概念,因此,任何路径只是相对于根目录而言的。
61
注意事项(二) Null Modem 线针脚定义 (DB-9 to DB-9) 1 和 6 短接 4 2 3 5 7 8
62
使用ActiveSync(零) 预备工作 1、确定CE支持ActiveSync 2、确定串口线的针脚定义如前所示
3、确认CE注册表串口设置中的sysint和IO base的设置应该和BIOS里保持一致。
63
使用ActiveSync(一) 连接操作一
1、连上串口线,启动CE后,在网络连接中新建连接,选择直接电缆连接,设置好BAUT RATE(应与开发机的端口速度保持一致)。
64
使用ActiveSync(二) 连接操作二 2、在CE下的电脑连接中,把当前连接设为“我的连接”。
65
使用ActiveSync(三) 连接操作三
3、在开发主机上打开超级终端,在CE下,在运行中执行repllog,如果是连通的状态,应该能在超级终端里看到CLIENT几个字母。如果还连接不通,就要确认以上几点是不是都做对了。
66
使用ActiveSync(四) 连接操作四
4、在开发主机上打开ActiveSync,点出Get Connected对话框,不要点“下一步”。
67
使用ActiveSync(五) 连接操作五
5、在CE下,在运行中敲入repllog,然后回车。在开发机上,在Get Connected对话框中点“下一步”,ActiveSync即可连通。
68
使用ActiveSync(六) 连接操作六 6、在主机上,可以选择建立同步关系。
69
在EVC中使用ActiveSync 1、在开发主机上打开EVC++;
2、运行Tools->”Configure Platform Manager”; 3、选择正确的平台和设备; 4、点“Properties…”; 5、在Transport和Startup中都选择“Microsoft ActiveSync”; 6、点“Test”测试连接结果。
70
在EVC中使用ActiveSync 连接上后,可以使用多种远程工具
71
A Q & Q U E S T I O N S A N S W E R S
Similar presentations