WinCE上驅(qū)動(dòng)程序的模型相對(duì)比較簡(jiǎn)單,實(shí)現(xiàn)一個(gè)驅(qū)動(dòng)程序不是什么難事。盡管如此,本文還是實(shí)現(xiàn)了一個(gè)比較通用一點(diǎn)的通訊接口。
應(yīng)用程序發(fā)給信息驅(qū)動(dòng)程序有兩種方式,同步調(diào)用和異步調(diào)用。
同步調(diào)用能夠讓驅(qū)動(dòng)程序立即處理應(yīng)用程序的請(qǐng)求,并返回驅(qū)動(dòng)程序處理后的結(jié)果。
如:
#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 <windows.h>
#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();
}
異步調(diào)用不需要結(jié)果返回,調(diào)用立即返回。對(duì)驅(qū)動(dòng)程序的請(qǐng)求會(huì)隨后執(zhí)行。
如:
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();
}
驅(qū)動(dòng)程序也可以通知應(yīng)用程序,應(yīng)用程序檢測(cè)到通知事件后,可以取回驅(qū)動(dòng)程序發(fā)送給應(yīng)用程序的請(qǐng)求。
如:
VOID ThreadForReceive()
{
//
// First of all, open the device
//
if(!IO_Open())
return;
//
// setup a receive event for driver
//
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if(hEvent == NULL)
return;
IO_InitializeReceiveEvent(hEvent);
//
// We can wait for this event and then receive one or more times
//
while(1)
{
DWORD dRet = WaitForSingleObject(hEvent, INFINITE);
if(dRet == WAIT_OBJECT_0)
{
DWORD NumbersRemained;
IO_MESSAGE OutMessage;
BOOL bRet = IO_Receive((PTLV)&OutMessage, sizeof(IO_MESSAGE), &NumbersRemained);
if(bRet == FALSE) // if return false, numbersremained is error code
{
}
else
{
}
for(int i=0; i<NumbersRemained; i++)
{
DWORD temp;
bRet = IO_Receive((PTLV)&OutMessage, sizeof(IO_MESSAGE), &temp);
}
}
// We can test here whether main process let us quit
//if(WAIT_OBJECT_0 == WaitForSingalObject(hQuitEvent, 0))
// break;
// As a test, any way we should break here
break;
}
// Free them
IO_RemoveReceiveEvent();
CloseHandle(hEvent);
//
// When we quit application, don't forget close device.
//
IO_Close();
}
驅(qū)動(dòng)程序和應(yīng)用程序之間通信
更新時(shí)間: 2007-02-02 09:39:29來(lái)源: 粵嵌教育瀏覽量:932
粵嵌動(dòng)態(tài)
推薦閱讀
- ·摩通傳動(dòng)(深圳)有限公司專場(chǎng)招聘會(huì)
- ·廣州2515嵌入式開(kāi)發(fā)就業(yè)班
- ·嵌入式系統(tǒng)代碼功耗與內(nèi)存優(yōu)化策略
- ·粵嵌科技深度參與第二屆全國(guó)大學(xué)生職業(yè)規(guī)劃大賽,以產(chǎn)教融合助力高質(zhì)量就業(yè)
- ·移遠(yuǎn)通信科技有限公司專場(chǎng)招聘會(huì)
- ·嵌入式系統(tǒng)設(shè)計(jì)的核心技術(shù)挑戰(zhàn)與創(chuàng)新實(shí)踐
- ·嵌入式實(shí)時(shí)操作系統(tǒng)的任務(wù)調(diào)度優(yōu)化策略與實(shí)踐
- ·湖北精實(shí)機(jī)電科技有限公司專場(chǎng)招聘會(huì)(長(zhǎng)沙校區(qū))
- ·信號(hào)量與互斥鎖在資源競(jìng)爭(zhēng)中的協(xié)同控制機(jī)制
- ·粵嵌科技2025年中總結(jié)大會(huì)召開(kāi)——擘畫產(chǎn)教融合新藍(lán)圖