当前位置: 代码迷 >> WinCE >> wince 流驱动与应用数据传输有关问题
  详细解决方案

wince 流驱动与应用数据传输有关问题

热度:531   发布时间:2016-04-28 13:52:25.0
wince 流驱动与应用数据传输问题
这是在wince6.0下编写的流驱动中读函数代码
DWORD PWM_Read(DWORD Handle, LPVOID pBuffer, DWORD Count)
{
DWORD *pReadBuffer;
  DWORD i=0;
// 映射地址空间
  pReadBuffer = MapPtrToProcess(pBuffer, GetCallerProcess());

for(i=0;i<5;i++)
{
*(pReadBuffer) = frePD[i];// frePD[i]为全局变量,DWORD frePD[5];
pReadBuffer++;
}


  if ((pBuffer == NULL) || (Count <= 0))

  { /* 读函数入口参数错误 */

  RETAILMSG(1, (TEXT("::: PWM_Read() parameter is error.\r\n")));  

  return 0;

  }

return 5 ;
}
在应用程序中接受数据的代码为:
BYTE *BufOut;
ReadFile(hPWM,&BufOut,5,0,NULL);

现在出现的问题是只要应用程序一调用ReadFile();DNW就会打印一些信息:
Exception 'Data Abort' (4): Thread-Id=09260016(pth=88d3c968), Proc-Id=00400002(pprc=83079308) 'NK.EXE', VM-active=08e10016(pprc=88c93dd0) 'pwmTest3.exe'
PC=c0283c80(devmgr.dll+0x00003c80) RA=c0283c80(devmgr.dll+0x00003c80) SP=d7b2fdd4, BVA=00000000
不过数据是传输正确的。请问问什么会出现上面的异常信息呢

------解决方案--------------------
注意检查函数的参数类型,把参数打印出来看看
------解决方案--------------------
看调试信息,是你的应用层出错。估计是调用底层驱动接口传递的参数不正确,最大可能就是数组指针这一类的,当这些没有进行分配空间就调用ReadFile的时候,底层对这个进行写操作就会出错。
------解决方案--------------------
BYTE *BufOut = new BYTE[5];
ReadFile(hPWM, &BufOut, 5, 0, NULL);
// use Bufout
delete [] BufOut; 

------解决方案--------------------
Or

BYTE BufOut[5] = {0};
ReadFile(hPWM, &BufOut[0], 5, 0, NULL);
------解决方案--------------------
3、4楼的回答是正确的,ReadFile函数是需要你传入存储空间的,你的BYTE *BufOut;只是定义了一个指针,没有分配空间,所以会出现“Data Abort”数据溢出的错误。
------解决方案--------------------
指针初始化没有分配空间。。。
------解决方案--------------------
看调试信息,还是你应用层出错。下面给你贴个例子:

驱动层:
C/C++ code
DWORD CSD_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count){    OutputDebugString( L"###Scan Code Driver Read\r\n" );        // ADD YOUR HANDLER    if(ReadLock || pBuffer == NULL)        return 0;    ReadLock = TRUE;    // 在这里添加打开扫描条码返回数据的处理    DWORD i = 0;    int8 rt;    char *outptr;    (char *)outptr = (char *)pBuffer;    char cBuf[MaxBarReadBuf];    memset(cBuf, 0, sizeof(cBuf) );    rt = GetBarCode(cBuf);//GetScanCode(cBuf);//    RETAILMSG(1, ( TEXT("** CodeScanDrv.cpp ** rt=%d\r\n"), rt) );    if(rt > 0){        for(i=0; i<=rt; i++){            // 防止数据溢出            if(i >= MaxBarReadBuf)        break;            *(outptr) = cBuf[i];            //RETAILMSG(1, ( TEXT("*** i=%d, (*outptr)=%d\r\n"), i, *(outptr)) );            outptr++;        }    }    ReadLock = FALSE;    OutputDebugString( L"###Scan Code Driver Read Success\r\n" );    return rt;}
------解决方案--------------------
也贴一段驱动代码,楼主可以参考
驱动层:
C/C++ code
/*******************************************************************************************函数名称: KEY_Read描    述: 读取按键标识输入参数: DWORD Handle    : 驱动程序引用事例句柄          LPVOID pBuffer  : 接收缓冲区          DWORD dwNumBytes: 要读的字节数输出参数: 无返    回: 实际读到字节数*******************************************************************************************/DWORD KEY_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes){    DWORD ret;    uchar* pReadBuffer;     if ((pBuffer == NULL) || (dwNumBytes <= 0))    {        return 0;     }        pReadBuffer = (uchar*)MapPtrToProcess(pBuffer, GetCallerProcess()); //pReadBuffer是应用程序的pBuffer在设备管理器上的地址映射!    *pReadBuffer = 0;        /* 挂起当前线程,直到 KEY1 按键按下或驱动关闭 */    ret = WaitForMultipleObjects(2, gReadKeyEvent, FALSE, INFINITE);        if (ret == WAIT_OBJECT_0)    {        ResetEvent(gReadKeyEvent[0]);        *pReadBuffer = 1;                                        /* 按键按下 */        v_pIOPregs->rGPBDAT &= ~(3<<6);        RETAILMSG (1,(TEXT("%x \r\n"),*pReadBuffer));        RETAILMSG(1, (TEXT("::: KEY_Read Successfully! \r\n")));        return 1;    }    else if(ret == (WAIT_OBJECT_0 + 1))    {        ResetEvent(gReadKeyEvent[1]);        *pReadBuffer = 0;                                        /* 驱动关闭 */        return 1;            }            return 0;
  相关解决方案