WinCE中串口驱动及接口函数介绍

合集下载

Wince串口通信

Wince串口通信
ltancy Service
串口通信函数介绍
设置接收和发送缓冲区的大小: 设置接收和发送缓冲区的大小: 利用函数SetupComm来设置接收和发送数据的缓 利用函数 来设置接收和发送数据的缓 冲区的大小.这个函数不推荐使用, 冲区的大小.这个函数不推荐使用,系统会推荐一个 合适的默认值. 合适的默认值. 清空串口缓冲区: 清空串口缓冲区: 利用函数PurgeComm来清空串口的发送缓冲区和 利用函数 来清空串口的发送缓冲区和 接收缓冲区. 接收缓冲区. 清除错误并查询状态: 清除错误并查询状态: 中利用ClearCommError函数清除驱动 在WINCE中利用 中利用 函数清除驱动 程序产生的任何错误状态并返回当前窗口状态. 程序产生的任何错误状态并返回当前窗口状态.
Softeem Consultancy Service
串口通信函数介绍
打开关闭串口: 打开关闭串口: 函数中可以通过CreateFile函数打开串口,利用这个 函数打开串口, 在WINCE函数中可以通过 函数中可以通过 函数打开串口 函数打开窗口需要注意的是在串口名之后必须加一个冒号(:), 函数打开窗口需要注意的是在串口名之后必须加一个冒号 ,在 参数中要注意设置共享参数为独占方式( ), ),安全参数和模板 参数中要注意设置共享参数为独占方式(0),安全参数和模板 文件参数也必须被设置成NULL. 文件参数也必须被设置成 当使用完串口后要注意使用CloseHandle函数来关闭串口. 函数来关闭串口. 当使用完串口后要注意使用 函数来关闭串口 配置串口: 配置串口: 在使用串口时,还必须配置好串口的波特率, 在使用串口时,还必须配置好串口的波特率,奇偶检验和数据 位等, 提供了 提供了GetCommState和SetCommState函数分别获 位等,CE提供了 和 函数分别获 取串口的当前参数和设置串口的参数. 取串口的当前参数和设置串口的参数. 读写串口: 读写串口: 程序中使用ReadFile和WriteFile函数读取串口数据和向串口 程序中使用 和 函数读取串口数据和向串口 中写入数据.由于串口读写数据的速度比较慢, 中写入数据.由于串口读写数据的速度比较慢,所以不要在主线 程中读写大量数据, 程中读写大量数据,所以最好的方法是用单独的线程来读写数据

WinCE中串口驱动及接口函数介绍

WinCE中串口驱动及接口函数介绍

WinCE中串口驱动及接口函数介绍串口驱动本身分为MDD层和PDD层。

MDD层对上层的Device Manager提供了标准的流设备驱动接口(COM_***),PDD层实现了HWOBJ结构及结构中若干针对于串口硬件操作的函数指针,这些函数指针将指向PDD层中的串口操作函数。

DDSI是指MDD层与PDD层的接口,在串口驱动中实际上就是指HWOBJ,PDD层会传给MDD层一个HWOBJ结构的指针,这样MDD层就可以调用PDD层的函数来操作串口。

微软针对于串口驱动提供了参考源代码,可以在下面的目录下找到:”\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\SERIAL”。

串口驱动的结构也就是这样了,下面介绍相关的驱动中的接口。

1. HWOBJ结构在串口驱动中,HWOBJ结构中的函数实现了对串口硬件的操作,并在MDD层被调用。

可以说,该结构描述了串口设备的所有特性,先来介绍一下该结构,具体定义如下:typedef struct __HWOBJ{ULONG BindFlags;DWORD dwIntID;PHW_VTBL pFuncTbl;} HWOBJ, *PHWOBJ;BindFlags:用于控制MDD层如何来处理IST,具体值如下:THREAD_IN_PDD:MDD层不处理,中断在PDD层处理。

THREAD_AT_INIT:在驱动初始化的时候,MDD层启动IST。

THREAD_AT_OPEN:在驱动被Open的时候,MDD层启动IST。

dwInitID:系统的中断号 pFuncTbl:指向一个PHW_VTBL结构,该结构中包含一个函数指针列表,这些函数指针指向串口硬件操作函数,用于操作串口。

view plaincopy to clipboardprint?typedef struct __HW_VTBL{PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext);ULONG (*HWDeinit)(PVOID pHead);BOOL (*HWOpen)(PVOID pHead);ULONG (*HWClose)(PVOID pHead);ULONG (*HWGetBytes)(PVOID pHead, PUCHAR pTarget, PULONG pBytes);PVOID (*HWGetRxStart)(PVOID pHead);INTERRUPT_TYPE (*HWGetIntrType)(PVOID pHead);VOID (*HWOtherIntrHandler)(PVOID pHead);VOID (*HWLineIntrHandler)(PVOID pHead);ULONG (*HWGetRxBufferSize)(PVOID pHead);VOID (*HWTxIntrHandler)(PVOID pHead);ULONG (*HWPutBytes)(PVOID pHead, PUCHAR pSrc, ULONG NumBytes, PULONG pBytesSent);BOOL (*HWPowerOff)(PVOID pHead);BOOL (*HWPowerOn)(PVOID pHead);VOID (*HWClearDTR)(PVOID pHead);VOID (*HWSetDTR)(PVOID pHead);VOID (*HWClearRTS)(PVOID pHead);VOID (*HWSetRTS)(PVOID pHead);BOOL (*HWEnableIR)(PVOID pHead, ULONG BaudRate);BOOL (*HWDisableIR)(PVOID pHead);VOID (*HWClearBreak)(PVOID pHead);VOID (*HWSetBreak)(PVOID pHead);BOOL (*HWXmitComChar)(PVOID pHead, UCHAR ComChar);ULONG (*HWGetStatus)(PVOID pHead, LPCOMSTAT lpStat);VOID (*HWReset)(PVOID pHead);VOID (*HWGetModemStatus)(PVOID pHead, PULONG pModemStatus);VOID (*HWGetCommProperties)(PVOID pHead, LPCOMMPROP pCommProp);VOID (*HWPurgeComm)(PVOID pHead, DWORD fdwAction);BOOL (*HWSetDCB)(PVOID pHead, LPDCB pDCB);BOOL (*HWSetCommTimeouts)(PVOID pHead, LPCOMMTIMEOUTS lpCommTO);BOOL (*HWIoctl)(PVOID pHead, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);} HW_VTBL, *PHW_VTBL;typedef struct __HW_VTBL{PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext);ULONG (*HWDeinit)(PVOID pHead);BOOL (*HWOpen)(PVOID pHead);ULONG (*HWClose)(PVOID pHead);ULONG (*HWGetBytes)(PVOID pHead, PUCHAR pTarget, PULONG pBytes);PVOID (*HWGetRxStart)(PVOID pHead);INTERRUPT_TYPE (*HWGetIntrType)(PVOID pHead);VOID (*HWOtherIntrHandler)(PVOID pHead);VOID (*HWLineIntrHandler)(PVOID pHead);ULONG (*HWGetRxBufferSize)(PVOID pHead);VOID (*HWTxIntrHandler)(PVOID pHead);ULONG (*HWPutBytes)(PVOID pHead, PUCHAR pSrc, ULONG NumBytes, PULONG pBytesSent);BOOL (*HWPowerOff)(PVOID pHead);BOOL (*HWPowerOn)(PVOID pHead);VOID (*HWClearDTR)(PVOID pHead);VOID (*HWSetDTR)(PVOID pHead);VOID (*HWClearRTS)(PVOID pHead);VOID (*HWSetRTS)(PVOID pHead);BOOL (*HWEnableIR)(PVOID pHead, ULONG BaudRate);BOOL (*HWDisableIR)(PVOID pHead);VOID (*HWClearBreak)(PVOID pHead);VOID (*HWSetBreak)(PVOID pHead);BOOL (*HWXmitComChar)(PVOID pHead, UCHAR ComChar);ULONG (*HWGetStatus)(PVOID pHead, LPCOMSTAT lpStat);VOID (*HWReset)(PVOID pHead);VOID (*HWGetModemStatus)(PVOID pHead, PULONG pModemStatus);VOID (*HWGetCommProperties)(PVOID pHead, LPCOMMPROP pCommProp);VOID (*HWPurgeComm)(PVOID pHead, DWORD fdwAction);BOOL (*HWSetDCB)(PVOID pHead, LPDCB pDCB);BOOL (*HWSetCommTimeouts)(PVOID pHead, LPCOMMTIMEOUTS lpCommTO);BOOL (*HWIoctl)(PVOID pHead, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);} HW_VTBL, *PHW_VTBL; 这些函数将在PDD层实现,用于实际的串口硬件操作。

wince串口

wince串口

WinCE中串口通讯的调试方法串口是嵌入式系统中应用很广的一种通讯接口。

在WinCE中,通常会有一个串口供调试使用,另外的串口可与外围设备连接,如GSM和GPS等模块,以获取相应的信息并进行处理。

在WinCE中,为了使用串口,必须有相应的串口驱动程序,一般在BSP 中都有实现。

串口驱动是典型的流驱动。

应用程序中可通过CreateFile()、ReadFile()和WriteFile()等文件系统的操作函数来访问串口,从而实现串口数据的收发。

虽然串口操作相对简单,但在实际调试时依然会碰到很多问题,譬如如何监视串口收发的数据。

在调试GSM模块时,如果WinCE不能正确控制模块,我们就需要确认是发送还是接收的问题,是模块还是开发板的问题。

在调试GPS模块时,经常需要监视GPS数据又不能影响固有GPS软件的运行。

这些都要求我们能内建虚拟串口,以将物理串口收到的数据分发到不同的虚拟串口上,相反,发送则是由不同的虚拟串口往物理串口转发的过程。

Serial Splitter Mobile就是这样一款专业软件,它能满足上述要求。

以前曾用它调试过一个串口设备。

当时用的是一个试用版,单次连接只能收发1M Bytes,超过1M就不工作了。

开始没在意,以为是串口驱动和自己软件的问题,后来发现是Serial Splitter试用版的限制。

调试手段引入的错误,是最让人郁闷的。

为了方便使用,今天到其官网下载了最新的版本,并破解之,去除了收发数据的限制和应用程序中的注册信息。

破解前的截图如下:破解后的截图如下:使用截图:该软件使用很方便,简单测试了一下,效果还是可以的,有需要的请到这里下载:/we-hjb/WINCE_SERIAL.rar,其中包括WinCE6.0下的Splitter Mobile破解版、WinCE串口调试助手和使用参考视频。

WINCE 驱动中断 相关函数详解

WINCE 驱动中断 相关函数详解

CreateEvent的用法HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // SD BOOL bManualReset, // reset typeBOOL bInitialState, // initial state LPCTSTR lpName // object name);该函数创建一个Event同步对象,并返回该对象的HandlelpEventAttributes 一般为NULLbManualReset 创建的Event是自动复位还是人工复位,如果true,人工复位, 一旦该Event被设置为有信号,则它一直会等到ResetEvent()API被调用时才会恢复为无信号. 如果为false,Event被设置为有信号,则当有一个wait到它的Thread时,该Event就会自动复位,变成无信号.bInitialState 初始状态,true,有信号,false无信号lpName Event对象名一个Event被创建以后,可以用OpenEvent()API来获得它的Handle,用CloseHandle() 来关闭它,用SetEvent()或PulseEvent()来设置它使其有信号,用ResetEvent()来使其无信号,用WaitForSingleObject()或WaitForMultipleObjects()来等待其变为有信号.PulseEvent()是一个比较有意思的使用方法,正如这个API的名字,它使一个Event对象的状态发生一次脉冲变化,从无信号变成有信号再变成无信号,而整个操作是原子的.对自动复位的Event对象,它仅释放第一个等到该事件的thread(如果有),而对于人工复位的Event对象,它释放所有等待的thread.kerneliocontrol()函数This function provides the kernel with a generic I/O control for carrying out I/O operations.该函数为内核提供执行IO操作的通用IO控制SyntaxBOOL KernelIoControl(DWORD dwIoControlCode,LPVOID lpInBuf,DWORD nInBufSize,LPVOID lpOutBuf,DWORD nOutBufSize,LPDWORD lpBytesReturned);Parameters参数dwIoControlCode[in] I/O control code, which should support the OAL I/O controls【输入】IO控制代码,支持OAL级的IO控制IOCTL_HAL_RELEASE_SYSINTRIOCTL_HAL_REQUEST_SYSINTRIOCTL_HAL_TRANSLATE_IRQlpInBuf[in] Pointer to a buffer that contains the data required to perform the operation.Set to NULL if the dwIoControlCode parameter specifies an operation that does not require inputdata.【输入】指向一个缓冲区,其包含执行操作所必须的数据。

WINCE6.0+S3C6410串口驱动

WINCE6.0+S3C6410串口驱动

WINCE6.0+S3C6410串口驱动WINCE串口驱动备注:本博文基于Real6410+WINCE6.0的系统来学习的1. 硬件设计图1 UART接口在此开发板中的应用如下:UART0作为调试口来使用图2 UART1用于和GPRS模块SIM900通信图3 UART2用于和GPS模块COMPASS_EB818通信图4UATR3用于和蓝牙模块通信图52. 软件设计2.1 WINCE串口驱动的架构在WINCE系统中,串口驱动是作为一个流驱动的形式存在,其驱动架构如下图所示:图6串口驱动分为MDD层和PDD层,DD层对上层的Device Manager(device.dll)提供了标准的流设备驱动接口(COM_xxx),PDD层实现了HWOBJ结构及结构中若干针对于串口硬件操作的函数指针,这些函数指针将指向PDD层中的串口操作函数。

DDSI是指MDD层与PDD层的接口,在串口驱动中实际上就是指HWOBJ,PDD层会传给MDD层一个HWOBJ结构的指针,这样MDD层就可以调用PDD层的函数来操作串口。

2.2 MDD层的导出接口函数MDD层为系统提供流设备接口,这些接口微软已经实现,但还是有必要学习一下2.2.1 COM_Init此函数始化串口设备,该函数通过读取注册表获得串口设备号,并获得相应的HWOBJ的结构指针,通过该指针调用PDD层的硬件初始化函数初始化串口。

Identifier:如果驱动被设备管理器加载,那么这个参数将包含一个注册表键值在”HKEY_LOCAL_MACHINE\Drivers\Active”路径下。

如果驱动是通过调用RegisterDevice函数来加载的,那么这个值等于dwInfo的值。

在COM_Init中,会先打开该键值,用返回的句柄来查询DeviceArrayIndex值,并根据该值获得PDD层的HWOBJ结构指针,下图是COM_Init函数的一部分图72.2.2 COM_Deinit卸载串口设备,该函数中主要做了一些释放资源的操作。

WinCE6.0下双模终端的USB转串口驱动开发

WinCE6.0下双模终端的USB转串口驱动开发
关键词 : n E . ; 模终端 ;S WiC 6 0 双 U B转 串 口
0 引 言
我国 3 G牌 照 的 发放 , 宣告 了 3 时代 的到 来 , G
基于 T —C MA和 C MA WC MA 的双 模 终 端 将 DS D D / D 取代 2 时代 的单 模 终 端 。诺 基亚 、 星 、 为 、 G 三 华 中 兴等 国 内外 通 信 厂 商 都 积 极 投 入 到 双 模 手 机 终 端 的开发 中来 , 目前 双模 手 机终 端 的研发 已经 成 为热 点 。当前市场 中主要 的智 能手 机操 作 系统 有 : o i N ka 主推 的 Sm in 开 放 内核 的嵌 入 式 Ln x 微 软 的 y ba , iu , WiC n E等 。由于 WiC 6 0嵌人 式 系统具 有实 时性 n E.
Wi E. U B设备驱动开发只提供了一些底层支持 n 60对 S C
的原因, 以通 信 模 块 厂 商 未 提 供 WiC 6 0下 的 所 nE .
U B驱 动 , 要 实 现 通 信 模 块 的基 本 功 能 , 开 发 S 而 除
纯 U B驱 动 外 , WiC 6 0下 , 需 要 修 改 Mo S 在 nE. 还 . d m源码 , e 存在 着开 发 周 期 长 、 作量 大 、 容 性 差 工 兼 等 问题 , 给开发 人 员带 来 了极 大 的不 便 。而通 过 串 口直接对 Mo e dm进 行操作 , 不仅 避 免 了上述 在开 发 中存 在 的问 题 , 时 由于操 作 Mo e 的 是 虚 拟 串 同 dm 口, 由它来 适 配 Moe 不 会 出 现 由物 理 串 口操 作 d m, Mo e 时制 约 M d m处理速 率 的问题 , 然保持 了 dm oe 仍 U B高 速的特 点 , 开 发人 员 只 需 开发 出对应 模 块 S 故 的 U B转 串 口驱 动 亦 可实 现 上 网 、 电话 等 功 能 ; S 打

WINCE下如何使用串口

WINCE下如何使用串口

WINCE下如何使用串口1.创建线程/////////////////////////////////////////////////////////////////// /////////DWORD CApplicationDlg::CommRecvTread(LPVOID lparam) {DWORD dwLength;char *recvBuf = new char[1024];CBuletoothApplicationDlg *pDlg = (CBuletoothApplicationDlg*)lparam;while(TRUE){if (WaitForSingleObject(pDlg->m_ExitThreadEvent, 0) == WAIT_OBJECT_0)break;if (pDlg->m_hComm != INVALID_HANDLE_VALUE){BOOL fReadState = ReadFile(pDlg->m_hComm, recvBuf, 1024, &dwLength, NULL);if(!fReadState){//MessageBox(_T("无法从串口读取数据!"));}else{if(dwLength != 0)OnCommRecv(pDlg, recvBuf, dwLength);}}}delete[] recvBuf;return 0;}/////////////////////////////////////////////////////////////////// ////////////2.打开串口,创建串口接收线程/////////////////////////////////////////////////////////////////// ///////////void CApplicationDlg::OnButtonPair(){// TODO: Add your control notification handler code here////////////////////////////////////////////////////////Sleep(100);////////////////////////////////////////////////////////DWORD IDThread;HANDLE hRecvThread;UpdateData(TRUE);CString strPort = PorTbl[m_ComboPort.GetCurSel()];DWORD baud = BaudTbl[m_ComboBaud.GetCurSel()];DWORD databit = DataBitTbl[1];BYTE stopbit = StopBitTbl[0];BYTE parity = ParityTbl[0];BOOL ret = OpenPort(strPort, baud, databit, stopbit, parity);if (ret == FALSE)return;m_ExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);// 创建串口接收线程hRecvThread = CreateThread(0, 0, CommRecvTread, this, 0, &IDThread);if (hRecvThread == NULL){MessageBox(_T("创建接收线程失败!"));return;}CloseHandle(hRecvThread);m_ButOpen.EnableWindow(FALSE);m_ButClose.EnableWindow(TRUE);MessageBox(_T("打开") + strPort + _T("成功!"));}/////////////////////////////////////////////////////////////////// //////////////3.串口接收线程/////////////////////////////////////////////////////////////////// /////////////DWORD CApplicationDlg::CommRecvTread(LPVOID lparam) {DWORD dwLength;char *recvBuf = new char[1024];CApplicationDlg *pDlg = (CApplicationDlg*)lparam;while(TRUE){if (WaitForSingleObject(pDlg->m_ExitThreadEvent, 0) == WAIT_OBJECT_0)break;if (pDlg->m_hComm != INVALID_HANDLE_VALUE){BOOL fReadState = ReadFile(pDlg->m_hComm, recvBuf, 1024, &dwLength, NULL);if(!fReadState)//MessageBox(_T("无法从串口读取数据!"));}else{if(dwLength != 0)OnCommRecv(pDlg, recvBuf, dwLength);}}}delete[] recvBuf;return 0;}/////////////////////////////////////////////////////////////////// //////////////4.串口接收信息处理/////////////////////////////////////////////////////////////////// /////////////void CALLBACK CApplicationDlg::OnCommRecv(CWnd* pWnd, char *buf, int buflen){//此处代码可以自己写了//接收到的串口信息处理部分}/////////////////////////////////////////////////////////////////// ///////////5.关闭串口/////////////////////////////////////////////////////////////////// //////////////BOOL CApplicationDlg::ClosePort(void)if(m_hComm != INVALID_HANDLE_VALUE){SetCommMask(m_hComm, 0);PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);CloseHandle(m_hComm);m_hComm = INVALID_HANDLE_VALUE;return TRUE;}return FALSE;}。

Windows CE下的串口驱动设计

Windows CE下的串口驱动设计
d vlp n f r e,rht tr f rvr n eitr p rcsigi id ws E Ipeet te rjc o r l r e, hc o ie e eeo met i rac icue ie dt er t oes W n o .t rsns oet f ei i rw i c mbns od v e od a h n u p n n C p h s ad v h h t
ly rdd ie t te m rv ra dito u e h p cf e eo me rc s fsra rv ra dtepo e s fitru t rc sig a ee rv rwi sra d e, n r d c stes e i cd v lp nt o eso e l i e n rc s er p o e sn . h i n i p i d h o n p
及 Wi o s E的中断处理 过程 ,提出流接 口和分层相结合的驱动程序 设计方案 ,给出 Wi o s E 下串口驱动的具体开发过程及串 口 n w d C n w d C 驱
动 的 中断 处 理过 程 。
关健词 :嵌入式系统;中断处理 ;串 口驱动
De i n o e i l i e i d wsCE sg fS ra v ri W n o Dr n
中圈 分类号 E 下 的 串 口驱 动 设 计 no C
司浩乐 ,万 波 ,田玉敏 ‘
( 西安电子科技大学外部设备研究所 ,西安 7 0 7 ) 10 1

要 :驱动程序 及串口驱动的开发和设计是构建嵌入式系统 的重要组成部分。该文介 绍了 Wi o s E下 的驱动程序 的结构、开发过程 n w d C
软为每种类型的本地驱动提供 了定制的接 I ,本地设备 驱动 S l 为所有特定类型的设备提供 了一组标准的功能 。常见的内建 驱动有键盘 、触摸屏 、音频设备等 。 可 安 装 的驱 动 程 序 又 称 作 流设 备 接 口程 序 (t a Sr ms e It fc r e) ne ae D i r,是 由设备 管理器 动态加载 的用 户模 式的 r v D L。这类驱动具有一组相 同的导出函数——流接 口函数, L

wince流接口驱动

wince流接口驱动

XXX_PowerDown 停止向设备供电。供可使用软件控制关闭的设备关闭自身电 源。
XXX_PowerUp
恢复向设备供电
XXX_R移动数据指针
XXX_Write
向设备写数据
其中XXX是驱动程序的设备名称。
实现流式接口驱动
1. 为流式接口驱动程序选择一个前缀 2. 实现流式接口驱动DLL所必需的接口函数 3. 编写DLL的导出函数定义文件.DEF 4. 为驱动程序配置注册表
应用程序 FileSys.exe 设备管理器(device.exe) 流式接口驱动程序
硬件
流接口函数
函数名 XXX_Close XXX_Deinit XXX_Init XXX_IOControl XXX_Open
说明 关闭以hOpenContext标识的设备上下文。 由设备管理器调用来删除对某一设备的初始化信息。 由设备管理器调用来对某一设备进行初始化。 向设备发送命令,以命令设备做一些事情。 打开一个设备以进行读、写或者既读又写。
流接口驱动
什么是流接口
流接口驱动包括所有提供流接口函数的驱 动程序,不管由这个驱动控制的设备是什 么类型。
在流式接口驱动程序中,驱动程序负责把 外设抽象成一个文件,而应用程序则使用 操作系统提供的文件API对外设进行访问。
典型的流接口驱动程序有:
➢ 文件系统驱动 ➢ 串口驱动
流式接口驱动程序的体系结构

wince流驱动入门讲解

wince流驱动入门讲解

第一章驱动的准备1. 驱动程序完成以下功能:对设备初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。

2. 整个硬件系统资源在驱动程序面前是赤裸裸的,驱动可以使用所有系统资源,编写驱动程序时我们必须格外小心驱动代码的边界条件,确保它们不会损坏整个操作系统。

3. WinCE毕竟是一个嵌入式系统,有其自身的特殊性,为了提高运行效率,所有驱动皆为动态链接库,驱动实现中可以调用所有标准的API。

而在其他Windows系统中可能的驱动文件还有.vxd,.sys和动态链接库。

4. Windows支持的驱动:1)虚拟设备驱动程序(V irtual Device Driver):Windows3.1(Windows95/98/Me)2)内核模式驱动程序(Kernel Mode Driver):Windows NT3)Win32驱动程序模型(Win32 Driver Mode):从Windows98开始使用。

其中WDM是目前主流,然而在WinCE系统中,由于硬件资源有限和嵌入式系统的特点,对其的支持非常有限。

第二章WINCE驱动1.WINCE驱动模型目前Windows CE提供了4种设备模型,其中2种专门用于Windows CE 模型,另外2种模型来自于其它的操系统,如图1所示:图1 Windows CE 各种驱动模型的关系2.我们的工作为了帮助开发者快速地开发Windows CE 驱动程序,微软在Platform Builder 中提供了大量的驱动程序例源代码,同时,芯片厂商或OEM 厂商有时也提供一些设备的驱动程序源代码,这些驱动程序源代码在多数情况下可以直接拿来使用,但是在少数情况下需要开发者根据自己的设备硬件特性做一些移植的工作,修改例源代码,重新编译和调试驱动程序。

移植工作虽然没有像开发一个全新的驱动程序那样富有挑战性,但它仍具有相当大的难度,其原因如下:移植工作仍然要求开发者具有良好的软、硬件基础,熟悉驱动程序的基本开发和调试方法,并要求具有一定的开发环境和测试手段。

WinCE系统下的驱动开发知识

WinCE系统下的驱动开发知识

WinCE第三方驱动安装之二——CAB安装包制作Microsoft Windows CE是紧凑的,高效的操作系统,它被广泛的应用在从手持电脑到专门的工业控制器或消费用电子产品等各种嵌入工业产品中。

英创公司ARM9系列工控主板预装了正版Windows CE5.0操作系统,并对板上所有硬件资源提供了完备的驱动支持。

随着WinCE操作系统的广泛应用,越来越多的在PC上使用的硬件设备提供了对WinCE系统的支持,如3G模块,Wi-Fi等。

第三方驱动一般以两种形式提供,一是动态链接库(*.dll)加对应的注册表文件(*.reg),另一种是可直接安装的CAB文件(*.cab)。

与动态链接库加注册表文件形式的驱动相比,CAB文件安装十分方便,不需要了解繁杂的WinCE INF文件格式或REG文件格式。

本文介绍通过WinCE CAB Manager工具将以动态链接库usbser.dll和注册表文件usbser.reg 形式提供的USB转串口驱动程序压缩为可直接在英创主板上安装的CAB压缩包的方法。

1、打开WinCE CAB Manager,选择File->New,运行New Cabinet wizard(CAB新建向导),选择“next”直至完成如图1。

2、在CAB Information上点击右键,选择Properties(属性)选项(如图2),打开CAB 包属性设置对话框,如图3。

3、在CAB Properties对话框中(如图3),填写Company Name(公司名称)和Application Name(CAB包名称)。

4、切换至CAB Properties->Installation Directory对话框,设置CAB包默认安装路径,此处设置为NandFlash\USBDriverDll目录,如图4。

5、切换至CAB Properties->Cabinet对话框,设置处理器类型,Processor可直接选择为ALL/CEF,如图5。

WinCE串口驱动分析

WinCE串口驱动分析

WinCE串口驱动分析虽然串口通讯已经是普遍的标准而且广为大家熟知,但驱动中涉及的部分内容也可能在平时的应用中并不是很常用到,在这里做一个简单的介绍待后面说明到具体代码的时候可以连贯一些。

串行通讯接口是目前十分流行的通讯接口之一。

由于其电气界面的简单性使其在计算机领域的应用相当的广泛。

在这里提到的串行通讯接口主要是指UART(通用串行)和IRDA两种。

通常的串行连接电气连接上有3wire和9wire两种。

3wire的接线方式下定义了发送、接收和地三根连接。

其用途就如名称一样分别用于发送、接收。

通常在串行接口控制器上会有两个FIFO用作接收和发送的缓冲,当接收到数据后会直接将接收到的数据置入该缓冲器,并同时由控制电路向本地总线发出通知,以便让本地总线将缓冲器内的数据读走,这样在响应(等待和读取)的过程中仍然能通过缓冲器来接收数据。

而发送发送的过程刚刚相反,本地总线可一直向发送缓冲写入数据直到器填满为止,而无需对每个数据的发送进行等待。

这就是基本的收发流程(这部分逻辑流程相信大家是最熟悉的)。

这一点在3wire和9wire中都是相同的。

但是我们考虑下面的情况,如果接收一方的响应由于某种原因的干扰(如处理器被其他中断服务占用)的时候可能就来不及相应之前ReceiveFIFO就可能被填满了,这样后续发送过来的数据就会丢失,这样在需要数据可靠传输的情况下串行通讯的弊端也就显示出来了。

如需要数据的可靠传输就需要对数据流的收发进行控制。

在9wire中将串行连接定义为如下形式。

也就是说在原3wire的基础上增加了DCD,DTR,DSR,RTS,CTS,DELL六个控制线。

其中RTS/CTS用于流控制,另外的DCD和DELL则留作连接modem使用。

有了专门的硬件流控制引脚也就使得流控制成为可能,以完成收发两端的匹配使得数据可以可靠的传输。

用RTS/CTS(请求发送/清除发送)流控制时,应将通讯两端的RTS、CTS线对应相连).在发送端准备发送数据之前设置RTS(Request to send)也就使发送请求线,若接收端以作好接收准备,就启动响应的CTS(Clear to send)引线。

WinCE虚拟串口驱动

WinCE虚拟串口驱动

WinCE虚拟串口驱动(一)/norains/archive/2009/03/28/4032257.aspx//===================================================================== ===//TITLE:// WinCE虚拟串口驱动(一)//AUTHOR:// norains//DA TE:// Saturday 28-March-2009//Environment:// WINDOWS CE 5.0//===================================================================== ===用过串口进行开发的朋友应该都知道,串口驱动是一个典型的独占设备。

简单点来说,就是在成功地调用CreateFile打开串口之后,没有通过CloseHandle进行关闭,是无论如何都不能再次调用CreateFile来再次打开相同的串口。

有的朋友可能会觉得莫名奇妙,为什么微软要在这上面做限制呢?但其实从另一个角度来讲,微软这么做是非常有道理的。

以接收数据为例子,在驱动里面会有一定的缓存,用来保留一定量的数据。

当通过ReadFile来获取数据时,驱动就会将缓存给清空,然后再继续接收数据。

如果串口不是独占设备,可以多次打开,那么在读取数据上面就会有问题:应该什么时候才清空缓存?比方说,其中一个线程通过ReadFile来获得了数据,那么驱动应不应该将缓冲清空?如果清空,那另一个线程也想获得同样的数据进行分析,那就会产生数据丢失;如果不清空,万一之前已经通过ReadFile获取数据的线程再次进行读取,那么它将会得到同样重复的数据。

如果想要在这多个进程中维持数据的同步,肯定要额外增加相应的标识,但这样就会加大了驱动的复杂度,并且也无法和别的驱动保持一致。

因此,微软对串口实行独占设备的策略,是非常正确的。

通信网络-Windows CE中实现蓝牙串口驱动程序

通信网络-Windows CE中实现蓝牙串口驱动程序

@D#E 的 许 多 应 用 正 是 基 于 蓝 牙 仿 真 串 口 % 而 流 接 口 驱
动程序通过一组流接口函数使得应用程序可以通过文 件系统中的特殊文件而与 设备 接口$因 此蓝 牙仿真 串口 的功能性更适合流接口驱动程序的结构%
-.- 蓝 牙 仿 真 串 口 驱 动 程 序 实 现
蓝 牙 仿 真 串 口 是 用 蓝 牙 FG>@%% 协 议 实 现 无 电 缆 的无线串口通信$与本机设备驱动程序一样$实现流接 口 的 串 口 驱 动 程 序 同 样 只 需 实 现 蓝 牙 的 1&& 模 块 %
‘i 包 含 两 个 "MM 实 例
的 数 组 i‘ *T *T
H36&,$$,-0$%,3 d<
‘i 存 储 设 备 驱 动 程 序 中 所
有 串 口 设 备 i‘
同 样 用 结 构 变 量 4VKb>VB3 定 义 了 控 制 端 口 的 MM90 函数名列表( 由于这个串口设备用作内部实现特殊的功 能$下面 只列 出了需 要关 心的 主要函 数名 ( %$)7, WLa>VHb 4VKb>VB3 g h 4VKb0)(,9&#(23T 4VKbM&()(,T 4VKbPN&) T 4VKb43$7&T
"/3-2<= ># 作 为 一 种 典 型 的 嵌 入 式 操 作 系 统 $ 通 过
将 蓝 牙 应 用 移 植 到 "/3-2<= ># 中 $ 对 于 如 ?$@$ A ! BC! 平 台 的 驱 动 程 序 " 1&& # % 本 文 采 用 分 层 的 驱 动 程 序 来 连 接蓝牙硬件和上面的文件传输应用% 图 ; 说明了两种驱 动 程 序 是 如 何 在 "/3-2<= ># 操 作 系 统 中 集 成 的 % 设 备 驱 动 程 序 接 口 " &&’ # 是 在 %&& 中 实 现 的 函 数 集 $ !"#$ 模 块 通 过 这 个 接 口 调 用 设 备 驱 动 程 序 ’ 设 备 驱 动 程 序 服 务 器 提 供 接 口 " &&$’ # 是 在 1&& 中 实 现 的 函 数 集 并 由 %&& 调 用 % 由 于 微 软 提 供 了 所 有 与 %&& 模 块 相 关的 源代 码$所 以对这 部分 不用做 任何 改动 $只 需 将 自 己 的 1&& 模 块 与 %&& 模 块 链 结 成 一 个 公 用 库 % 理解了本机设备驱 动程 序的 结构后 $从图 ; 右边不 难 看 出 $ 流 接 口 驱 动 程 序 只 是 把 流 接 口 作 为 它 们 的 &&’ 使 用 % 在 这 种 情 况 下 $ 不 必 要 把 这 些 驱 动 程 序 与 !"#$ 模 块 链 接 起 来 % 它 们 以 普 通 的 &(( 方 式 存 在 并 根 据 需 要 被调用%

Wince流式接口驱动

Wince流式接口驱动

Wince流式接口驱动流式接口驱动程序就是系统提供了一组相同的接口,并导出一组相同的函数,通过修改这些函数达到底层硬件的驱动,称为流式驱动(个人定义欢迎拍砖)。

以下描述均已I/O驱动为例说明。

建立流式驱动需要在BSP的\Src\Drivers目录下建立一个文件夹存放4个文件,它们分别是.cpp文件、.def文件、Makefile(无扩展名)文件、source(无扩展名)文件。

其中.cpp文件主要实现:驱动程序地址空间的分配、动态链接库的入口设置、12个外部入口函数的设置等;.def文件主要是声明需要输出的接口函数;Makefile和source是为仿造wince下的driver架构而建立的文件。

各个具体函数功能请参看代码注释。

在建立以上文件后,还需在Platform.reg文件中注册这个驱动的信息。

内容如下[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\GPIODriver]&quot;Prefix&quot;=&quot;GIO&quot;//声明驱动名称&quot;Index&quot;=dword:1&quot;Dll&quot;=&quot;GPIODriver.dll&quot;//动态链接库文件到此驱动函数基本上完成了,之后的工作就是VS2005创建一些控制界面以及调用这些函数而已。

那么对于一些习惯性写单片机程序的人,可能会有些疑问,在操作I/O时应该需要修改一些寄存器,为什么以上函数代码均没有做这方面的工作呢?其实寄存器的地址,以及地址映射在BSP中的.inc文件均有定义。

在wince是不用知道这些底层硬件的具体内容,它们对于wince来说就相当一个文件而已。

但本质上来说跟编写单片机程序操作I/O的原理是一样的,都是将I/O口控制为输出,在对数据寄存器赋值,只是wince下编程有人给我们做了一部分工作而已,其实就驱动而言,自己直接操作物理地址实现驱动会更易于理解和简单。

windows ce RS232C串行口驱动程序设计

windows ce RS232C串行口驱动程序设计

实验5 RS232C串行口驱动程序设计实验目的掌握RS232串行口设备驱动程序的编写方法,实现串行口的初始化、中断管理、发送与接收处理的程序设计技巧。

实验环境⏹操作系统:windows 2000以上版本,要求安装.NET Framework 1.1⏹软件工具列表:⏹Microsoft ActiveSyn 4.5;⏹Platform Builder 5.0;实验学时2学时,必做实验。

实验内容理解驱动程序的原理与功能,掌握流式接口驱动程序的结构、编写、加载及调试过程预备知识驱动程序是对底层硬件的抽象。

应用程序开发者不需要真正理解底层驱动的工作原理,他们只需要通过Windows CE提供的API函数,就可以直接与硬件进行交互。

例如,如果应用程序要对串口进行操作,只需要:1.在COMx上调用CreateFile( )2.调用WriteFile( ) 往串口写数据3.调用CloseHandle( ) 关闭串口对于其他类型的API也是一样的。

如果我们需要向显示器输出,我们只需要调用PolyLine( ), 或者MoveToEx( ), LineTo( )等函数,而不需要理解显示器的真正工作原理。

在Windows CE中,驱动就是一个简单的用户态动态链接库(DLL),DLL 会导出一些公共的接口,DLL被父进程(通常是device.exe或者gwes.exe)加载,然后,父进程通过DLL导出的接口调用DLL。

流式接口的驱动程序导出一系列大家熟知的接口。

还拿串口驱动当例子。

我们希望可以往串口读写数据,因此,我们希望驱动程序可以导出Open, Close, Read, 和Write接口。

此外,流式接口的驱动程序还导出如下函数:PowerUp, PowerDown, IO Control, Init, 和DeInit.实验步骤一.、编写流式接口的驱动程序1.打开Platform Builder。

2.利用Platform Wizard创建新的平台3.在Platform Builder中选择“File”->“New Project or File”,创建一个“Windows CE Dynamic link library”项目,项目的名称填写“My Driver”。

Windows CE下串口驱动关键技术

Windows CE下串口驱动关键技术

icu ig r g s rc n g r i n it r p r c s i g i lme tt n o n t n i DD n DD y r T e itn in n ld n i e o f u a o , ne r t o e sn . mp e n ai f u ci M e t i t u p o f o n a dP l e. h e t a n o o t i p p r s oo e e in meh dt i e r g a o e e d d e up n i d ws . f s a e f r s t o d v r o m f mb d e ime tn W n o h it d g or p r q i CE
指示 发送 器 是否 为空 ,发送 缓 冲区 是否 为空 , 接 收缓 冲 区是否 准备 好
指示 U R A T的一 些错误 状 态 。
UT H X
UF T T SA lI 『Ⅻ l
写 入要发 送 的数据

指 示 FF IO是 否为 空和 使用 的空 间等 读 出要 读 的数据
பைடு நூலகம்
是驱动设计 的关键环节 。驱动程序 需要实现 特定设备 的中断响应 , 对数据进行处理 。 n o s E将 中断过 Wid w C
程 分为 IR ( S 中断服 务例程 )和 I T ( S 中断服务线程 )
指针,这样 MD D层就可 以调用 P D层 的函数来操作 D 串口。原理图如图 1 所示 。
两 部分【, n o s E操作系统不能直接处理物理 中 4 Wid w J C
断 ,只能处理系统 中断 。IR 运行在 内核模 式下 ,向 S 系统返回 中断标识号给 中断处理器 ,并且屏 蔽板级的

WindowsCE下GPIO流接口的驱动程序开发原理

WindowsCE下GPIO流接口的驱动程序开发原理
Pr Cl s 、 e o e XXX

P e ii。其 中 , rDe t n XXX 表 示 设 备 名 的 前
品 。它 的 模 块 化 设 计 使 嵌 入 式 系 统 和 应 用 程 序 开 发 者 能
够 方 便 地 加 以定 制 , 以适 应 一 系 列 产 品 ( 如 消 费 类 电 子 例
( m m unia in Tr nng Ba eofPLA e r lSt f e dq re s Xua Co c to aii s G ne a a fH a ua t r , nhua07 00, 51 Chi ) na
Ab tac :GPI ( e e a npu nd o pu ors i ido sCE a fe d ton lf n to u h a o r n ur e l c w h n m i sr t O g n r li ta ut tp t ) n W n w c n o f ra dii a u c i nss c sc ntola d s v il e, e — an

Re d、XXX a

W rt 、XXX ie

Po r p we U
领 域 开 发 的 嵌 入 式 操 作 系 统 。该 系 统 是 一 种 紧 凑 、 效 、 高
可伸缩 的 3 2位操 作 系 统 , 要 面 向 各 种 嵌 入 式 系 统 和 产 主
XX 二 P weDo XXX—I o to XXX—S e XXX— o r wn OC n rl ek
能 。 本 文 分 析 了基 于 流 驱 动 的 GP O 驱 动 开 发 原 理 , S 3 4 0的 GP 端 口 为 例 详 细 叙 述 了 GP O 驱 动 开 发 过 程 , I 以 C 61 M I 并

WINCE系统API说明文档

WINCE系统API说明文档

目录1. DeviceAPI.dll的API说明 (7)1.1WIFI (7)1.1.1WifiOn() (7)1.1.2WifiOff() (7)1.1.3WifiDriver_whether_loaded() (7)1.1.4WifiGet_signal() (7)1.2GPRS (7)1.2.1GPRSPowerOn() (7)1.2.2GPRSPowerOff() (8)1.2.3GPRSReset() (8)1.2.4GPRS_judge_connection_status() (8)1.2.5GPRS_close_connection() (8)1.2.6GPRS_judge_modem_status() (8)1.2.7GPRS_open_serial() (8)1.2.8GPRS_close_serial() (9)1.2.9GPRS_send_data() (9)1.2.10GPRS_receive_data() (9)1.3CDMA (9)1.3.1CDMA_power_on() (9)1.3.2CDMA_power_off() (9)1.3.3CDMA_reset() (9)1.3.4CDMA_online_data_to_command_status() (10)1.3.5CDMA_sync_dialing() (10)1.4GPS (10)1.4.1Gps_init() (10)1.4.2Gps_free() (10)1.4.3BDS_init() (10)1.4.4BDS_free() (10)1.4.5Gps_open_serial() (11)1.4.6Gps_close_serial() (11)1.4.7Gps_send_data() (11)1.4.8Gps_receive_data() (11)1.51D (11)1.5.1Barcode1D_init() (11)1.5.2Barcode1D_free() (11)1.5.3Barcode1D_scan() (11)1.62D硬解码 (12)1.6.1Barcode2D_init() (12)1.6.2Barcode2D_free() (12)1.6.3Barcode2D_scan() (12)1.72D软解码 (12)1.7.1SoftDecoding_Init() (12)1.7.2SoftDecoding_Deinit() (12)1.7.3SoftDecoding_Select_ScanMode() (13)1.7.4SoftDecoding_Scan() (13)1.7.5SoftDecoding_Select_SnapshotMode() (13)1.7.6SoftDecoding_Snapshot() (13)1.7.7SoftDecoding_BarcodeType_OnOff() (13)1.8PSAM (14)1.8.1Psam_init_Ex() (14)1.8.2Psam_free_Ex() (14)1.8.3Psam_powerOn_Ex() (14)1.8.4Psam_powerOff_Ex() (14)1.8.5Psam_select_Ex() (14)1.8.6Psam_command_Ex() (15)1.8.7Psam_IO_PowerOn() (15)1.8.8Psam_IO_PowerOff() (15)1.8.9Psam_IO_GetRandom() (15)1.8.10Psam_IO_CmdSendAndRecv() (15)1.9EM125K (16)1.9.1EM125k_init() (16)1.9.2EM125k_free() (16)1.9.3EM125k_OpenAntenna() (16)1.9.4EM125k_CloseAntenna() (16)1.9.5EM125k_read() (16)1.9.6EM125k_UID_REQ() (17)1.9.7EM125k_ReadHitag() (17)1.9.8EM125k_WriteHitagPage() (17)1.9.9EM125k_WriteHitagBlock() (17)1.9.10EM125k_Read4305() (17)1.9.11EM125k_Write4305() (18)1.10ISO 14443A (18)1.10.1RF_ISO14443A_init() (18)1.10.2RF_ISO14443A_free() (18)1.10.3RF_OpenAntenna() (18)1.10.4RF_CloseAntenna() (18)1.10.5RF_ISO14443A_request() (18)1.10.6RF_ISO14443A_request_Ex() (19)1.10.7RF_ISO14443A_anticoll() (19)1.10.8RF_ISO14443A_select() (19)1.10.9RF_ISO14443A_halt() (19)1.10.10RF_ISO14443A_authentication() (19)1.10.11RF_ISO14443A_read() (20)1.10.12RF_ISO14443A_write() (20)1.10.13RF_ISO14443A_initval() (20)1.10.14RF_ISO14443A_readval() (20)1.10.15RF_ISO14443A_decrement() (21)1.10.16RF_ISO14443A_increment() (21)1.10.17RF_ISO14443A_restore() (21)1.10.18RF_ISO14443A_transfer() (21)1.10.19RF_ISO14443A_ul_anticoll() (21)1.10.20RF_ISO14443A_ul_write() (22)1.10.21RF_ISO14443A_cpu_rats() (22)1.10.22RF_ISO14443A_cpu_reset() (22)1.10.23RF_FM1216_OnekeyReset() (22)1.10.24RF_ISO14443A_cpu_command() (22)1.10.25RF_ModeSwitch() (23)1.11ISO 14443B (23)1.11.1RF_ISO14443B_cpu_reset() (23)1.11.2RF_ISO14443B_cpu_command() (23)1.11.3RF_ISO14443B_AT88SC6416_set_user_zone() (23)1.11.4RF_ISO14443B_AT88SC6416_read_user_zone() (23)1.11.5RF_ISO14443B_AT88SC6416_read_sys_zone() (24)1.11.6RF_ISO14443B_AT88SC6416_write_user_zone() (24)1.11.7RF_ISO14443B_AT88SC6416_write_sys_zone() (24)1.11.8RF_ISO14443B_AT88SC6416_check_password() (25)1.11.9RF_ISO14443B_AT88SC6416_Verify_Crypto() (25)1.11.10RF_ISO14443B_AT88SC6416_Send_Checksum() (25)1.11.11RF_ISO14443B_AT88SC6416_debug() (26)1.12ISO15693 (26)1.12.1RF_ISO15693_init() (26)1.12.2RF_ISO15693_free() (26)1.12.3RF_ISO15693_inventory() (26)1.12.4RF_ISO15693_stayQuiet() (26)1.12.5RF_ISO15693_read_sm() (27)1.12.6RF_ISO15693_write_sm() (27)1.12.7RF_ISO15693_lockBlock() (28)1.12.8RF_ISO15693_select() (28)1.12.9RF_ISO15693_resetToReady() (28)1.12.10RF_ISO15693_writeAFI() (29)1.12.11RF_ISO15693_lockAFI() (29)1.12.12RF_ISO15693_writeDSFID() (30)1.12.13RF_ISO15693_lockDSFID() (30)1.12.14RF_ISO15693_getSystemInformation() (30)1.12.15RF_ISO15693_getMultipleBlockSecurityStatus() (31)1.13UHF (31)1.13.1UHFFlagCrcOn() (31)1.13.2UHFFlafCrcOff() (31)1.13.4UHFFree() (32)1.13.5UHFOpenAndConnect() (32)1.13.6UHFCloseAndDisconnect() (32)1.13.7UHFGetPower () (32)1.13.8UHFSetPower () (32)1.13.9UHFGetFrequency() (32)1.13.10UHFSetFrequency_EX() (33)1.13.11UHFSetFrequency() (33)1.13.12UHFReadCommand() (34)1.13.13UHFReadStatus() (34)1.13.14UHFInventory() (34)1.13.15UHFGetReceived() (34)1.13.16UHFStopGet() (34)1.13.17UHFReadData() (35)1.13.18UHFWriteData() (35)1.13.19UHFEraseData() (35)1.13.20UHFLockMem() (36)1.13.21UHFKillTag() (36)1.13.22UHFGetVersion() (36)1.13.23UHFInventorySingle() (36)1.13.24UHFReadDataSingle() (37)1.13.25UHFWriteDataSingle() (37)1.13.26UHFReadDataNoCnt() (37)1.13.27UHFReadDataSingleNoCnt() (38)1.13.28UHFEraseDataSingle() (38)1.13.29UHFLockMemSingle() (39)1.13.30UHFKillTagSingle() (39)1.13.31UHFAddSelect() (39)1.13.32UHFDeleteSelect() (39)1.13.33UHFGetSelect() (40)1.13.34UHFGetSelectReceived() (40)1.13.35UHFChooseSelect() (40)1.13.36UHFInventoryAdvanced() (40)1.13.37UHFGetInventoryAdvancedStatus() (41)1.13.38UHFReadBuffer() (41)1.13.39UHFGetBuffer() (41)1.14指纹 (41)1.14.2EMFingerFree() (42)1.14.3EMGetRandomData() (42)1.14.4EMGetImage() (42)1.14.5EMGenChar() (42)1.14.6EMMatch() (42)1.14.7EMSearch() (42)1.14.9EMStorChar() (43)1.14.10EMLoadChar() (43)1.14.11EMUpChar() (43)1.14.12EMDownChar() (44)1.14.13EMDeletChar() (44)1.14.14EMEmpty() (44)1.14.15EMSetReg() (44)1.14.16EMAutoEnroll() (44)1.14.17EMAutoMatch() (44)1.14.18EMSetPSW() (45)1.14.19EMVfyPSW() (45)1.14.20EMValidTempleteNum() (45)1.14.21EMReadChipSN() (45)1.14.22EMSetManuFacture() (45)1.14.23EMSetDeviceName() (46)1.14.24EMReadSysPara() (46)1.14.25EMUpImage() (46)1.15红外 (46)1.15.1Infrared_init() (46)1.15.2Infrared_free() (46)1.15.3Infrared_send() (47)1.15.4Infrared_receive() (47)1.16背光 (47)1.16.1GetBackLightLevel() (47)1.16.2SetBackLightLevel() (47)1.17Power (47)1.17.1module_power_control() (47)1.17.2system_power_down() (48)1.17.3power_key_enabled() (48)1.17.4power_key_disabled() (48)1.17.5system_restart() (48)1.18触摸 (49)1.18.1touch_screen_enable() (49)1.18.2touch_screen_disable() (49)1.19USB (49)1.19.1usb_device_get_current_mode() (49)1.19.2usb_device_close_usb_function() (49)1.19.3usb_device_storage_card_as_udisk() (49)1.19.4usb_device_flash_as_udisk() (50)1.19.5usb_device_set_as_activeSync() (50)1.20LED (50)1.20.1led_control_init() (50)1.20.2led_control_switch() (50)1.21扩展串口 (51)1.21.1serial_open_extended_port() (51)1.21.2serial_close_extended_port() (51)1.21.3serial_send_extended_port_data() (51)1.21.4serial_receive_extended_port_data() (51)1.22扩展函数接口 (51)1.22.1READ_API_Version() (51)1.22.2HardwareVersion_Ex() (52)1.22.3SerialPortSwitch_Ex() (52)1.22.4SerialPortControl_Ex() (52)1.22.5SerialPortOpen_Ex() (52)1.22.6SerialPortSetBaudRate_Ex() (53)1.22.7SerialPortFunctionSwitch_Ex() (53)1.23操作系统功能接口 (53)1.23.1Uniscribe_disable () (53)2.CameraAPI.dll的API说明 (54)2.1GetCameraAPI_Version() (54)2.2Preview() (54)2.3CameraInit() (54)2.4CameraPreview() (54)2.5TakePicture() (54)2.6StartRecording() (55)2.7StopRecording() (55)2.8FreeCamera() (55)1.DeviceAPI.dll的API说明1.1WIFI1.1.1WifiOn()1.1.4WifiGet_signal()1.2GPRSGPRS部分开发注意事项:⑴先对GPRS模块成功上电后再打开串口。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

WinCE中串口驱动及接口函数介绍串口驱动本身分为MDD层和PDD层。

MDD层对上层的Device Manager提供了标准的流设备驱动接口(COM_***),PDD层实现了HWOBJ结构及结构中若干针对于串口硬件操作的函数指针,这些函数指针将指向PDD层中的串口操作函数。

DDSI是指MDD层与PDD层的接口,在串口驱动中实际上就是指HWOBJ,PDD层会传给MDD层一个HWOBJ结构的指针,这样MDD层就可以调用PDD层的函数来操作串口。

微软针对于串口驱动提供了参考源代码,可以在下面的目录下找到:”\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\SERIAL”。

串口驱动的结构也就是这样了,下面介绍相关的驱动中的接口。

1. HWOBJ结构在串口驱动中,HWOBJ结构中的函数实现了对串口硬件的操作,并在MDD层被调用。

可以说,该结构描述了串口设备的所有特性,先来介绍一下该结构,具体定义如下:typedef struct __HWOBJ{ULONG BindFlags;DWORD dwIntID;PHW_VTBL pFuncTbl;} HWOBJ, *PHWOBJ;BindFlags:用于控制MDD层如何来处理IST,具体值如下:THREAD_IN_PDD:MDD层不处理,中断在PDD层处理。

THREAD_AT_INIT:在驱动初始化的时候,MDD层启动IST。

THREAD_AT_OPEN:在驱动被Open的时候,MDD层启动IST。

dwInitID:系统的中断号 pFuncTbl:指向一个PHW_VTBL结构,该结构中包含一个函数指针列表,这些函数指针指向串口硬件操作函数,用于操作串口。

view plaincopy to clipboardprint?typedef struct __HW_VTBL{PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext);ULONG (*HWDeinit)(PVOID pHead);BOOL (*HWOpen)(PVOID pHead);ULONG (*HWClose)(PVOID pHead);ULONG (*HWGetBytes)(PVOID pHead, PUCHAR pTarget, PULONG pBytes);PVOID (*HWGetRxStart)(PVOID pHead);INTERRUPT_TYPE (*HWGetIntrType)(PVOID pHead);VOID (*HWOtherIntrHandler)(PVOID pHead);VOID (*HWLineIntrHandler)(PVOID pHead);ULONG (*HWGetRxBufferSize)(PVOID pHead);VOID (*HWTxIntrHandler)(PVOID pHead);ULONG (*HWPutBytes)(PVOID pHead, PUCHAR pSrc, ULONG NumBytes, PULONG pBytesSent);BOOL (*HWPowerOff)(PVOID pHead);BOOL (*HWPowerOn)(PVOID pHead);VOID (*HWClearDTR)(PVOID pHead);VOID (*HWSetDTR)(PVOID pHead);VOID (*HWClearRTS)(PVOID pHead);VOID (*HWSetRTS)(PVOID pHead);BOOL (*HWEnableIR)(PVOID pHead, ULONG BaudRate);BOOL (*HWDisableIR)(PVOID pHead);VOID (*HWClearBreak)(PVOID pHead);VOID (*HWSetBreak)(PVOID pHead);BOOL (*HWXmitComChar)(PVOID pHead, UCHAR ComChar);ULONG (*HWGetStatus)(PVOID pHead, LPCOMSTAT lpStat);VOID (*HWReset)(PVOID pHead);VOID (*HWGetModemStatus)(PVOID pHead, PULONG pModemStatus);VOID (*HWGetCommProperties)(PVOID pHead, LPCOMMPROP pCommProp);VOID (*HWPurgeComm)(PVOID pHead, DWORD fdwAction);BOOL (*HWSetDCB)(PVOID pHead, LPDCB pDCB);BOOL (*HWSetCommTimeouts)(PVOID pHead, LPCOMMTIMEOUTS lpCommTO);BOOL (*HWIoctl)(PVOID pHead, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);} HW_VTBL, *PHW_VTBL;typedef struct __HW_VTBL{PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext);ULONG (*HWDeinit)(PVOID pHead);BOOL (*HWOpen)(PVOID pHead);ULONG (*HWClose)(PVOID pHead);ULONG (*HWGetBytes)(PVOID pHead, PUCHAR pTarget, PULONG pBytes);PVOID (*HWGetRxStart)(PVOID pHead);INTERRUPT_TYPE (*HWGetIntrType)(PVOID pHead);VOID (*HWOtherIntrHandler)(PVOID pHead);VOID (*HWLineIntrHandler)(PVOID pHead);ULONG (*HWGetRxBufferSize)(PVOID pHead);VOID (*HWTxIntrHandler)(PVOID pHead);ULONG (*HWPutBytes)(PVOID pHead, PUCHAR pSrc, ULONG NumBytes, PULONG pBytesSent);BOOL (*HWPowerOff)(PVOID pHead);BOOL (*HWPowerOn)(PVOID pHead);VOID (*HWClearDTR)(PVOID pHead);VOID (*HWSetDTR)(PVOID pHead);VOID (*HWClearRTS)(PVOID pHead);VOID (*HWSetRTS)(PVOID pHead);BOOL (*HWEnableIR)(PVOID pHead, ULONG BaudRate);BOOL (*HWDisableIR)(PVOID pHead);VOID (*HWClearBreak)(PVOID pHead);VOID (*HWSetBreak)(PVOID pHead);BOOL (*HWXmitComChar)(PVOID pHead, UCHAR ComChar);ULONG (*HWGetStatus)(PVOID pHead, LPCOMSTAT lpStat);VOID (*HWReset)(PVOID pHead);VOID (*HWGetModemStatus)(PVOID pHead, PULONG pModemStatus);VOID (*HWGetCommProperties)(PVOID pHead, LPCOMMPROP pCommProp);VOID (*HWPurgeComm)(PVOID pHead, DWORD fdwAction);BOOL (*HWSetDCB)(PVOID pHead, LPDCB pDCB);BOOL (*HWSetCommTimeouts)(PVOID pHead, LPCOMMTIMEOUTS lpCommTO);BOOL (*HWIoctl)(PVOID pHead, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);} HW_VTBL, *PHW_VTBL; 这些函数将在PDD层实现,用于实际的串口硬件操作。

2. MDD层APIMDD层向上提供了流设备接口,这部分代码微软已经实现,用于管理串口。

虽然我们不需要实现这部分,但是还是对相应的接口做个简单介绍。

2.1HANDLE COM_Init(ULONG Identifier):初始化串口设备,该函数通过读取注册表获得串口设备号,并获得相应的HWOBJ的结构指针,通过该指针调用PDD层的硬件初始化函数初始化串口。

Identifier:如果驱动被设备管理器加载,那么这个参数将包含一个注册表键值在” HKEY_LOCAL_MACHINE\Drivers\Active”路径下。

如果驱动是通过调用RegisterDevice函数来加载的,那么这个值等于dwInfo的值。

在COM_Init中,会先打开该键值,用返回的句柄来查询DeviceArrayIndex值,并根据该值获得PDD层的HWOBJ结构指针。

2.2 BOOL COM_Deinit(void):卸载串口设备,该函数中主要做了一些释放资源的操作。

也可以被DeregisterDevice函数调用。

2.3 HANDLE COM_Open(HANDLE pContext, DWORD AccessCode, DWORD ShareMode):打开串口设备。

应用程序调用CreateFile函数打开串口时,该函数会被调用。

pContext:COM_Init函数返回的Handle。

AccessCode:设置访问模式,比如共享读或者是读写模式。

ShareMode:在参数从应用程序中的CreateFile函数中传来,表示是否支持独自占有。

2.4 BOOL COM_Close(DWORD pContext):关闭串口设备。

应用程序调用CloseHandle函数关闭串口时,该函数会被调用。

pContext:该参数为COM_Open函数返回的Handle。

相关文档
最新文档