请教各位高人!USB我用的是PDIUSBD12驱动。上位机测试程序是MFC编写的现在问题是上位机能通过USB发送指令给测试板,测试板的LED灯会亮,但却接受不到数据,调试发现数据内存为空。是端口设置不对还是什么原因?

解决方案 »

  1.   

    UINT ReadReportThread(LPVOID pParam)
    {
    CMyUsbHidTestAppDlg *pAppDlg;
    DWORD Length, Counter;
    UINT i;
    CString Str; //将参数pParam取出,并转换为CMyUsbHidTestAppDlg型指针,
    //以供下面调用其成员函数。
     pAppDlg=(CMyUsbHidTestAppDlg*)pParam; //该线程是个死循环,直到程序退出时,它才退出
    while(1)
    {
    //设置事件为无效状态
    ResetEvent(ReadOverlapped.hEvent);  //如果设备已经找到
    if(MyDevFound==TRUE)
    {
    if(hReadHandle==INVALID_HANDLE_VALUE) //如果读句柄无效
    {
    pAppDlg->AddToInfOut("无效的读报告句柄,可能是打开设备时失败");
    }
    else  //否则,句柄有效
    {
    //则调用ReadFile函数请求9字节的报告数据
    ReadFile(hReadHandle,
    ReadReportBuffer,
    9,
    NULL,
    &ReadOverlapped);

    } //等待事件触发
    WaitForSingleObject(ReadOverlapped.hEvent,INFINITE); //如果等待过程中设备被拔出,也会导致事件触发,但此时MyDevFound
    //被设置为假,因此在这里判断MyDevFound为假的话就进入下一轮循环。
    if(MyDevFound==FALSE) continue; //如果设备没有被拔下,则是ReadFile函数正常操作完成。
    //通过GetOverlappedResult函数来获取实际读取到的字节数。
    GetOverlappedResult(hReadHandle,&ReadOverlapped,&Length,TRUE); //如果字节数不为0,则将读到的数据显示到信息框中
    if(Length!=0)
    {
     pAppDlg->AddToInfOut("读取报告"+pAppDlg->itos(Length)+"字节");
     Str="";
     for(i=0;i<Length;i++)
     {
      Str+=pAppDlg->itos(ReadReportBuffer[i],16).Right(2)+" ";
     }
     pAppDlg->AddToInfOut(Str, FALSE);
    } //如果字节数为9,则说明获取到了正确的9字节报告
    if(Length==9)
    {
    //第一字节为报告ID,应该为0
    if(ReadReportBuffer[0]==0)
    {
    //第二字节为按键状态,将其保存到KeyStatus中。
    KeyStatus=ReadReportBuffer[1]; //刷新按键的情况。
    pAppDlg->SetKeyStatus(); //第3、4、5、6字节为设备返回的发送次数值。计算出值后并显示。
    Counter=ReadReportBuffer[5];
    Counter=(Counter<<8)+ReadReportBuffer[4];
    Counter=(Counter<<8)+ReadReportBuffer[3];
    Counter=(Counter<<8)+ReadReportBuffer[2];
    pAppDlg->SetCounterNumber(Counter);
    }
    }
    }
    else
    {
    //阻塞线程,直到下次事件被触发
     WaitForSingleObject(ReadOverlapped.hEvent,INFINITE);
      }
    }
    return 0;
    }其中调试时ReadReportBuffer为0,数据长度为0