[内核技术] 自定义USB Hid通信问题

[复制链接]
 楼主| 素心向暖颜 发表于 2013-11-28 17:31 | 显示全部楼层 |阅读模式
电脑可以识别自定义的Hid设备,可是给设备发数据时候总是卡死在写函数,writefile。部分代码如下
  1. UINT WriteReportThread(LPVOID pParam)//写线程
  2. {
  3.         while(1)
  4.         {
  5.                 ResetEvent(WriteOverlapped.hEvent);
  6.                 WaitForSingleObject(WriteOverlapped.hEvent, INFINITE);
  7.                 DataSending = false;
  8.         }

  9.         return 0;
  10. }

  11. BOOL CUSBDlg::SendData()//发送数据
  12. {
  13.         BOOL Result;
  14.         UINT LastError;
  15.         UINT i;
  16.         CString Str,str_send;
  17.         DWORD Length = 0;

  18.         if(MyDevFind==FALSE)
  19.         {
  20.         AddToInfoOut(_T("设备未找到"));
  21.                 return FALSE;
  22.         }

  23.         if(hWriteHandle==INVALID_HANDLE_VALUE)
  24.         {
  25.                 AddToInfoOut(_T("无效的写报告句柄,可能是打开设备时失败"));
  26.                 return FALSE;
  27.         }

  28.         if(DataSending==TRUE)
  29.         {
  30.                 AddToInfoOut(_T("数据正在发送中,暂时不能发送"));
  31.                 return FALSE;
  32.         }

  33.         memset(WriteReportBuffer, 0, 512);
  34.         WriteReportBuffer[0]=0x00;
  35.    
  36.         CString str_id=itos(WriteReportBuffer[0],16).Right(2);
  37.         GetDlgItem(IDC_EDIT_REPORTID)->SetWindowText(str_id);       
  38.        
  39.         GetDlgItemText(IDC_ESend, str_send);
  40.         UINT count=str_send.GetLength();
  41.     for(i=1; i<1+count; i++)
  42.     {
  43.       WriteReportBuffer[i]=(UCHAR)str_send.GetAt(i-1);
  44.     }
  45.     WriteReportBuffer[1] = 0x40;
  46.         WriteReportBuffer[2] = 0xa2;
  47.         WriteReportBuffer[3] = 0x02;
  48.        
  49.         AddToInfoOut(_T("发送信息:1字节报告ID+8字节实际数据"));
  50.         Str=_T("");
  51.         for(i=0; i<Capabilities.OutputReportByteLength; i++)
  52.         {
  53.                 Str+=itos(WriteReportBuffer[i],16).Right(2)+_T(" ");
  54.         }
  55.         AddToInfoOut(Str, FALSE);

  56.         str_send.Insert(0, _T("发送信息"));
  57.         GetDlgItem(IDC_REC_STR)->SetWindowText(str_send);
  58.         UpdateWindow();

  59.          DataSending=TRUE;

  60.         Result=WriteFile(hWriteHandle,
  61.                                  &WriteReportBuffer,
  62.                                          Capabilities.OutputReportByteLength,
  63.                                          &Length,
  64.                                         (LPOVERLAPPED)&WriteOverlapped);

  65. if(Result==FALSE)
  66.         {
  67.                 LastError=GetLastError();
  68.                 if((LastError==ERROR_IO_PENDING)||(LastError==ERROR_SUCCESS))
  69.                 {
  70.                         WaitForSingleObject(WriteOverlapped.hEvent, INFINITE);
  71.                         DataSending = false;
  72.                         return TRUE;
  73.                 }
  74.                 else
  75.                 {
  76.                         DataSending=FALSE;
  77.                         AddToInfoOut(_T("错误代码:")+itos(LastError));
  78.                         if(LastError==1)
  79.                         {
  80.                                 AddToInfoOut(_T("该设备不支持WriteFile函数。"), FALSE);
  81.                         }
  82.                         return FALSE;
  83.                 }
  84.         }

  85.         AddToInfoOut(_T("数据发送成功!"));
  86.         DataSending = FALSE;
  87.         return TRUE;

  88. }
fengdingkusong 发表于 2013-12-2 09:24 | 显示全部楼层
写之前的配置信息呢?
fengdingkusong 发表于 2013-12-2 09:43 | 显示全部楼层
数据包是多大的?64字节的长度的话一包数据应该发送65个字节,第一个字节必须为0,这是我调用的
BOOL ret;
ret = WriteFile(hWriteHandle,writeBuf,65,NULL,&WriteOverlapped);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部