在应用程序和驱动通信中应该注意的问题

来源:互联网 发布:招聘淘宝美工的要求 编辑:程序博客网 时间:2024/05/17 01:26

作者:wogoyixikexie@gliet

    

        刚才论坛有位兄台应用和驱动通信不成功,我帮他解决了问题,现在写入博客,造福you and me

==========================================================================

各位大侠:
      小弟在WinCE系统中添加了自己写的LED灯的驱动程序,并写了一个MFC程序测试之。却发现存在一些问题。CreateFile成功,但是灯却没有亮,下面的部分代码,大哥大姐们帮忙了。

static AT91PS_PIO  g_pPIOB;
static AT91PS_PMC  g_pPMC;

BOOL Addr_Init()
{
BOOL bRet = TRUE;
PHYSICAL_ADDRESS PhysAddrPiob;
PHYSICAL_ADDRESS PhysAddrPmc;
 
PhysAddrPiob.LowPart = (DWORD) AT91C_BASE_PIOB;
PhysAddrPiob.HighPart = 0;
g_pPIOB = (AT91PS_PIO) MmMapIoSpace(PhysAddrPiob,sizeof(AT91S_PIO),FALSE);
if (g_pPIOB == NULL)
{
RETAILMSG(1,(L"Failed to remap the PIO registrers/r/n"));
bRet = FALSE;
}

    PhysAddrPmc.LowPart = (DWORD) AT91C_BASE_PMC;
PhysAddrPmc.HighPart = 0;
g_pPMC = (AT91PS_PMC) MmMapIoSpace(PhysAddrPmc,sizeof(AT91S_PMC),FALSE);
if (g_pPMC == NULL)
{
RETAILMSG(1,(L" Failed to remap the PMC registrers/r/n"));
bRet = FALSE;
}
   
return bRet;
}


BOOL WINAPI  DllEntry(HANDLE hInstDll,DWORD dwReason,LPVOID lpvReserved)

   
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls((HMODULE)hInstDll);
break;
case DLL_PROCESS_DETACH:
break;

}
return 1;
}


DWORD LES_Init(DWORD dwContext)
{   

Addr_Init();
g_pPMC->PMC_PCER  = 1 < <3;

return 1;
}


DWORD LES_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode)
{     
     
    g_pPIOB->PIO_PER  = (1 < <11) |(1 < <16) |(1 < <17) |(1 < <18);
g_pPIOB->PIO_OER  = (1 < <11) |(1 < <16) |(1 < <17) |(1 < <18);
g_pPIOB->PIO_CODR = (1 < <11) |(1 < <16) |(1 < <17) |(1 < <18);   
    return 1;
}

应用程序中打开驱动的函数如下:

void CLedsDlg::OnOpen()
{
// TODO: Add your control notification handler code here
hFile = CreateFile(TEXT("LES:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(hFile == NULL)
{
        MessageBox(_T("不能打开LES"));
}
else
{
MessageBox(_T("打开LES成功"));
}

}

我设置LED灯的驱动程序在生成系统镜像的时候就进行了编译,且编译进内核,因此只需打开驱动就可以使用了吧、

现在用到的程序代码主要就这些了。各位大哥帮忙看看是什么地方出问题了。
谢,急等
===================================================================================

引用 9 楼 gooogleman 的回复:
void CLedsDlg::OnOpen()
{
// TODO: Add your control notification handler code here
hFile = CreateFile(TEXT("LES:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(hFile == NULL)
{
        MessageBox(_T("不能打开LES"));
}
else
{
MessageBox(_T("打开LES成功"));
}

}
——————貌似TEXT("LES:")应该为TEXT("LES1:"),,你改动试试。我看很多例子都是后面带个数字
还有LES_Open中加入打印信息,看是否被应用调用了。



哈哈,我也是碰巧。一起学习。

————————————————————————————————————

引用 11 楼 qiu__zhi2008 的回复:
非常感谢gooogleman哥哥,正如你所说的,hFile = CreateFile(TEXT("LES:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); 中LES后面必须带上索引号,否则的话是不行的,
希望看过本帖子的初学者可以引以为鉴,
感动的要哭了,
谢谢
结贴



不用......

 

转载请标明:作者wogoyixikexie@gliet.桂林电子科技大学一系科协,原文地址:http://blog.csdn.net/gooogleman——如有错误,希望能够留言指出;如果你有更加好的方法,也请在博客后面留言,我会感激你的批评和分享。

原创粉丝点击