//////////////////////////////////////////////////////////////////////////
//读报告线程
//由于使用的是异步调用,因而在调用ReadFile
//函数时提供一个Overlapped的结构,该结构中含有一个事件的
//句柄。平时该事件是处于无信号状态的,因而等待事件的函数
//就会被挂起,从而该线程被阻塞。当数据正确返回后,事件被
//触发,线程恢复运行。并检查返回的数据量以及报告ID是否正
//确,从而设置界面上各开关的状态。由于该函数并不是
//CMYUSBDlg类(就是该工程中主窗口类)中的成员函数,
//所以无法直接调用CMYUSBDlg类中的成员函数。
//在创建该线程时,通过pParam参数传递了一个this指针,将参数pParam
//强制转化为CMYUSBDlg类的指针即可访问CMYUSBDlg类
//中的成员函数。
DWORD IsReadReportThread(LPVOID pParam)
{
CMYUSBDlg *pUsbDlg;
DWORD dwLength;
UINT i;
CString strTmp;
unsigned char ucReadReportBuffer[64]={0};
//memset(ucReadReportBuffer, 0, 64);
//将参数pParam取出,并转换为CMYUSBDlg型指针,
//以供下面调用其成员函数。
pUsbDlg=(CMYUSBDlg *)pParam; //该线程是一个死循环,直到程序退出时,它才退出
while (1)
{
//设置事件为无效状态
ResetEvent(lpReadOverlapped.hEvent); //如果设备已经找到
if (bMyDevFound)
{
if (hReadHandle!=INVALID_HANDLE_VALUE)//如果读句柄无效
{
#ifdef MY_DEBUG
//pUsbDlg->GainToInfOutPut("IsReadReportThread线程:有效的读报告句柄");
#endif
//则调用ReadFile函数请求9字节的报告数据
ReadFile(
hReadHandle,
ucReadReportBuffer,
64,
NULL,
&lpReadOverlapped
);
}
else
#ifdef MY_DEBUG
pUsbDlg->GainToInfOutPut("IsReadReportThread线程:无效的读报告句柄");
#endif
//等待事件触发
WaitForSingleObject(lpReadOverlapped.hEvent,INFINITE);

//如果等待过程中设备被拔出,也会导致事件触发,但此时bMyDevFound
//被设置为假,因此在这里判断bMyDevFound为假的话就进入下一轮循环。
if(bMyDevFound==FALSE) 
{
continue;
} //如果设备没有被拔下,则是ReadFile函数正常操作完成。
//通过GetOverlappedResult函数来获取实际读取到的字节数。
GetOverlappedResult
(
hReadHandle,
&lpReadOverlapped,
&dwLength,
TRUE
);
//如果字节数不为0,则将读到的数据显示到信息框中
if (dwLength!=0)
{
//pUsbDlg->GainToInfOutPut("读取 数据"+pUsbDlg->itos(dwLength)+"字节");
strTmp="";
for (i=1;i<2;i++ )
{
//因为itos默认为4位,所以要取右边2位
strTmp+=pUsbDlg->itos(ucReadReportBuffer[i],16).Right(2)+" ";
}
pUsbDlg->GainToInfOutPut(strTmp,FALSE);

}

解决方案 »

  1.   

    字符串最后要有0结尾
    如果你的数据是“1234”,缓冲区必须是5个,即0x31,0x32,0x33,0x34,0x00
      

  2.   

    ReadFile 有可能直接成功, 另外设置断点单步调试运行看看BOOL bRdOK = ReadFile(hReadHandle, ucReadReportBuffer, 64, &dwLength, &lpReadOverlapped);
    if( (!bRdOk) && GetLastError() == ERROR_IO_PENDING)
    {
      bRdOK =  GetOverlappedResult(hReadHandle, &lpReadOverlapped, &dwLength, TRUE);
    }
    if(bRdOK)

     strTemp.Format(_T("Read %u Bytes:"), dwLength);
     for(DWORD i=0; i<dwLength; i++)
     {
      CString s; s.Format(_T("%02X "),  (UTIN)ucReadReportBuffer[i]);
      strTemp += s;
     }
     if(pUsbDlg)  pUsbDlg->GainToInfOutPut(strTmp,FALSE);
    }