graycker 发表于 2012-8-17 17:36:53

USB上位机调用writefile出现1784错误

程序是圈圈书里的,百度下好些人问这个问题,也有的自己解决了,但是没找到解决办法
BOOL CMyUsbHidTestAppDlg::OnDebug()
{
        BOOL Result;
        UINT LastError;
        UINT i;
        CString Str;
        //如果设备没有找到,则返回失败
        if(MyDevFound==FALSE)
        {
                AddToInfOut("设备未找到");
                return FALSE;
        }

        //如果句柄无效,则说明打开设备失败
        if(hWriteHandle==INVALID_HANDLE_VALUE)
        {
                AddToInfOut("无效的写报告句柄,可能是打开设备时失败");
                return FALSE;
        }

        //如果数据仍在发送中,则返回失败
        if(DataInSending==TRUE)
        {
                AddToInfOut("数据正在发送中,暂时不能发送");
                return FALSE;
        }

        //设置要发送报告的数据
        WriteReportBuffer=0x09;                //报告ID为0
        WriteReportBuffer=1;                        //将LED状态放到缓冲区中
        WriteReportBuffer=1;                        // 非0即为debug模式
        //显示发送数据的信息
        AddToInfOut("发送输出报告2字节");
        /*
        Str="";
        for(i=0;i<9;i++)
        {
                Str+=itos(WriteReportBuffer,16).Right(2)+" ";
        }
        AddToInfOut(Str,FALSE);
        */
        //设置正在发送标志
        DataInSending=TRUE;

        //调用WriteFile函数发送数据
        Result=WriteFile(hWriteHandle, WriteReportBuffer, 3, NULL, &WriteOverlapped);

        //如果函数返回失败,则可能是真的失败,也可能是IO挂起了
        if(Result==FALSE)
        {
                //获取最后错误代码
                LastError=GetLastError();
                //看是否是真的IO挂起
                if((LastError==ERROR_IO_PENDING)||(LastError==ERROR_SUCCESS))
                {
                        return TRUE;
                }
                //否则,是函数调用时发生错误,显示错误代码
                else
                {
                        DataInSending=FALSE;
                        AddToInfOut("发送失败,错误代码:"+itos(LastError));
                //如果最后错误为1,说明该设备不支持该函数。
                        if(LastError==1)
                        {
                                AddToInfOut("该设备不支持WriteFile函数。", FALSE);
                        }
                        return FALSE;
                }
        }
        //否则,函数返回成功
        else
        {
                DataInSending=FALSE;
                return TRUE;
        }
}

bbs2009 发表于 2012-8-17 18:32:43

graycker 发表于 2012-8-18 10:07:51

bbs2009 发表于 2012-8-17 18:32 static/image/common/back.gif
何必一定要用 OO 的 例程?
C:\Keil\ARM422\ARM\Utilities\HID_Client下 有HID 现成的例程。
非 HID 建 ...

现在还没安装keil for arm,
而且设备就是个HID设备,可以用哪个库么?

bbs2009 发表于 2012-8-18 10:38:00

graycker 发表于 2012-8-18 10:41:03

bbs2009 发表于 2012-8-18 10:38 static/image/common/back.gif
安装keil for arm 吧。
C:\Keil\ARM\Utilities\HID_Client下 有HIDPC端的例程。
C:\Keil\ARM\Board ...

嗯,好的,谢谢了

graycker 发表于 2012-8-18 10:44:20

        0x05, 0x01,                                       // USAGE_PAGE (Generic)                                2
        0x09, 0x00,                                                // USAGE        自定义                                        4
        0xa1, 0x01,                                                 // COLLECTION (Application)                        6
        0x85, REPORTID_DEBUG,                                // REPORT_ID ()                                         8           0x09
        0x09, 0x01,                                                 //   USAGE 1                                                10
        0x15, 0x00,                                                //   LOGICAL_MINIMUM                                12
        0x25, 0xff,                                                 //   LOGICAL_MAXIMUM                                14
        0x75, 0x08,                                                 //   REPORT_SIZE                                        16
        0x95, 0x10,                                                 //   REPORT_COUNT                                        18        16个字节,作为调试用
        0x81, 0x02,                                                 //   INPUT                                                         20       
        0x09, 0x02,                                                 //   USAGE 2                                                22       
        0x15, 0x00,                                                 //   LOGICAL_MINIMUM                                24
        0x25, 0xff,                                                //   LOGICAL_MAXIMUM                                26
        0x75, 0x08,                                                 //   REPORT_SIZE                                        28
        0x95, 0x02,                                               //   REPORT_COUNT                                        30         2个输出字节
        0x91, 0x02,                                                 //   OUTPUT                                                 32       
        0xc0                                                                 // END_COLLECTION                                   33        0x00ff
在报告描述符的最好我写了这么一段,想作为调试用,
但我把       
0x09, 0x01,                                                 //   USAGE 1
0x09, 0x02,                                                 //   USAGE 2
这两段去掉后程序编译正常,但是下载到板子上不能正常运行
我怀疑问题可能出在这里,OO的示例中就没这两句

zhengshijian33 发表于 2013-11-14 17:04:47

一般是下位机的报告描述符的接收字节和上位机writefile()里的长度不一致导致~!~~

luodan 发表于 2015-6-15 17:56:56

正在搞USB,writefile老是返回0,GetLastError也算0.不知道是什么原因
页: [1]
查看完整版本: USB上位机调用writefile出现1784错误