ReadFile()调用XXX-OPEN()出现的问题

本文分析了使用ReadFile函数从设备读取数据时遇到的问题,原本期望读取512个数据,但在第163个数据时发生错误。通过对代码及调用过程的分析,找到了可能的原因在于缓冲区设置不当,并给出了相应的解决方法。

出现的问题:

      上层用ReadFile(hFile, &status, 512, &actlen, NULL)打开设备调用DWORD KEY_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)这个函数时出现问题,本来是要返回512个数据的,结果打印显示打印到163个数据的时候就出现错误了。串口打印如下:


 162   1813

 163   1754

Fatal Stack Error, Terminating thread 8fd56704, pexi = 1006fe24
Exception 'Data Abort' Thread=8fd56704 AKY=00000085 PC=01d320cc BVA=10070000
 R0=01d31908  R1=000000a4  R2=000006da  R3=000006da
 R4=000000a4  R5=10070000  R6=01d33078  R7=00000200
 R8=1006feb8  R9=80000004 R10=00000001 R11=1006fe94
R12=8f7d1143  SP=1006fe54  Lr=01d320d4 Psr=8000001f
Data Abort: Thread=8fd56704 Proc=8ddd6160 'device.exe'

 

分析原因:

      可能是上层调用不规范,同样的问题在以前用IOControl这个函数里也出现过的,以前解决方法

DeviceIoControl(hFile, IOCTL_SET_ADC_CHANNEL, &channel, 1,  DispAIN0, 512, &intlen, NULL);

将接收缓冲设为512问题就解决了

函数分析

 unsigned short *pReadBuffer;
 /*add end 09-6-16 by zhouyi*/

 if ((pBuffer == NULL) || (dwNumBytes <= 0))
  return 0;

 pReadBuffer = MapPtrToProcess(pBuffer, GetCallerProcess());

 

  for(i=0; i<512; i++)
  {
   *pReadBuffer= *v_pDaqData;
   RETAILMSG (1,(TEXT(" %d   %d/n/r"),i,*pReadBuffer));
   pReadBuffer++; 
  }

在163次时pReadBuffer就出现问题,函数异常,显然问题出在pReadBuffer上

 

解决办法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值