打印
[STM32F1]

Readfile读HID报告!长时间通讯,有时读超时!

[复制链接]
2205|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sxslyy|  楼主 | 2013-12-10 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
if(hReadHandle!=INVALID_HANDLE_VALUE) //句柄有效
                {
                        //则调用ReadFile函数请求9字节的报告数据
                        Result=ReadFile(hReadHandle,
                                         ReadReportBuffer,
                                         Capabilities.InputReportByteLength,
                     &NumberOfBytesRead,
                                         &ReadOverlapped);
                }
                else
                {
                        return false;
                }
                //如果函数返回失败,则可能是真的失败,也可能是IO挂起了
                if(Result==FALSE)
                {
                        //获取最后错误代码
                        LastError=GetLastError();

                        //看是否是真的IO挂起
                        if((LastError==ERROR_IO_PENDING)||(LastError==ERROR_SUCCESS))
                        {
                                //等待事件触发
                                Result = WaitForSingleObject(ReadOverlapped.hEvent,iTimeOut);//INFINITE
                        }
                        //否则,是函数调用时发生错误,显示错误代码
                        else
                        {
                                AfxMessageBox("IO挂起错误!",MB_OK);
                        }
                }
                //否则,函数返回成功
                else
                {
                        //等待事件触发
                        Result = WaitForSingleObject(ReadOverlapped.hEvent,iTimeOut);//INFINITE
                }
                switch (Result)
                {
                        case WAIT_OBJECT_0:
                                {
                                        break;
                                }
                        case WAIT_TIMEOUT:
                                {
                                        /*API call: CancelIo
                                        Cancels the ReadFile
                                        Requires the device handle.
                                        Returns non-zero on success.
                                        */
                                        AfxMessageBox("超时!",MB_OK);
                                        Result = CancelIo(hReadHandle);
                                        return false;

                                        break;
                                }
                        default:
                                {
                                        //AfxMessageBox("未知!",MB_OK);
                                        return false;
                                        break;
                                }
                }
来读取HID设备的报告
  21.1  DO     02 5a                                                                                                   .Z                1.9ms      2298.1.0        
  22    DO     02 5a 00 00  00 00                                                                                      .Z....              2us      2299.1.0        
  21.1  DI     02 02 04 06  08 01 06 01  09                                                                            .........          58ms      2300.1.0        
  22    DI     02 02 04 06  08 01 06 01  09 ff 09 09  25 04 01 28  02 00 00 3f                                         ............%..(   16us      2301.1.0   
上面是示例数据 Bus Hound 上看 报告ID 02 输入报告  人体输入21.1和Compliant 22 都有数据 但Readfile读超时。现象是:输入输出nK字节,即读写
多次后!不定期就会有一次读超时!求教这是为什么!

读是异步多线程的。流程是向写HID,再从HID中读。
//设置HID设备驱动中的缓冲区大小
Result = HidD_SetNumInputBuffers(hDevHandle,USB_BUFFER_SIZE);设置为128

HID设备中定义多报告ID         用端点1,输入输出最大长度64         端口查询时间1MS            TXADD ox100      RXADD 0x140
沙发
sxslyy|  楼主 | 2013-12-18 21:16 | 只看该作者

自己顶一下!

使用特权

评论回复
板凳
airwill| | 2013-12-21 12:51 | 只看该作者
不定期错误, 比较讨厌的问题, 引起的可能性很广啊.可以考虑
多设置状态指示, 条件保存措施, 在捕捉到错误是提供足够多的信息分析问题原因.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

31

帖子

0

粉丝