驱动与应用通信

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

在应用程序里面创建的事件对象,传递句柄给驱动,然后驱动触发事件再让应用程序读取数据或传递事件对象的名称,然后在驱动里面openevent,第二参数BOOL bManualReset尽量采用自动

WINCE应用程序和驱动间通信

分类:wince 2009-10-15 11:40 602人阅读评论(4) 收藏举报

WinCE上驱动程序的模型相对比较简单,实现一个驱动程序不是什么难事。尽管如此,本文还是实现了一个比较通用一点的通讯接口。

应用程序发给信息驱动程序有两种方式,同步调用和异步调用。

同步调用能够让驱动程序立即处理应用程序的请求,并返回驱动程序处理后的结果。如:

#define MSG_TYPE_TEST_1 0x00000000

#define MSG_TYPE_ICMP_PACKET 0x00000001

#pragma pack(push, 1)

typedef struct __IO_MESSAGE

{

ULONG Type;

ULONG Length;

union

{

struct

{

double x;

double y;

}Test_1;

struct

{

UCHAR MiniPacket[128];

}Icmp_Packet;

// All other messages add here

}value;

}IO_MESSAGE, *PIO_MESSAGE;

#pragma pack(pop)

#include

#include "ioexample.h"

#include "ioapp.h"

VOID SendMessageWithResult()

{

//

// First of all, open the device

//

if(!IO_Open())

return;

//

// Build message

//

IO_MESSAGE Msg;

Msg.Type = MSG_TYPE_TEST_1;

Msg.Length = sizeof(Msg.value.Test_1);

Msg.value.Test_1.x = 3.0;

Msg.value.Test_1.y = 4.0;

//

// Call API to send, IO_SendEx run sync and then return a result.

//

UCHAR lpOutBuf[8];

DWORD BytesReturned;

BOOL bRet = IO_SendEx((PTLV)&Msg, TLV_LENGTH(&Msg), lpOutBuf, 8,

&BytesReturned);

if(!bRet) // If return FALSE, BytesReturned is error code.

{

switch(BytesReturned)

{

case IO_ERROR_INVALID_LENGTH:

break;

case IO_ERROR_UNKNOWN:

break;

}

}

//

// Then we get the result

//

double z = *(double*)lpOutBuf;

//

// When we quit application, don't forget close device.

//

IO_Close();

}

异步调用不需要结果返回,调用立即返回。对驱动程序的请求会随后执行。如:

VOID SendMsg()

{

//

// First of all, open the device

//

if(!IO_Open())

return;

//

// Build message

//

IO_MESSAGE Msg;

Msg.Type = MSG_TYPE_TEST_1;

Msg.Length = sizeof(Msg.value.Test_1);

Msg.value.Test_1.x = 3.0;

Msg.value.Test_1.y = 4.0;

//

// Call API to send, IO_SendEx run async.

//

BOOL bRet = IO_Send((PTLV)&Msg, TLV_LENGTH(&Msg)); // if we give

sizeof(Msg) is also OK.

if(!bRet) // If return FALSE, something error.

{

}

//

// When we quit application, don't forget close device.

//

IO_Close();

}

驱动程序也可以通知应用程序,应用程序检测到通知事件后,可以取回驱动程序发送给应用程序的请求。

如:

VOID ThreadForReceive()

{

//

// First of all, open the device

相关文档
最新文档