阅读:1609回复:5
各位高手留步!!!在hid类编程中遇见一个奇怪的问题!!!
我刚注册,没多少分,大家原谅!!!
我在编写hid类器件的编程中遇见一个奇怪的问题,程序在和设备设备建立连接,识别后经检查无误,取得的厂商(vendor id)和产品(product id)的id号和厂家提供的id完全符合.缓冲区的指针和设备的能力也取得了,并且也不是按键型hid类设备。 而且设备里的确是有数据的,但在用readfile函数取数据时取得的数据全是0,我检查了数据类型和前期的连接相信没错。各位高手那位能给我讲讲这是为什么???还有各位能否留下QQ号,我在编程时还有些没解决的 问题想请教大家, 我的QQ:121144437(微尘)!!!我先谢谢大家了!!! 下面是我的程序,主要使用的API函数这些函数在DDK中可以找到,此外我的HID设备有两个管道 一个是写,一个是读。程序有点乱,大家包含一下吧!!!这是程序中德读文件的那部分,全体出来就太乱了,只要能解决问题,谁要全部我给谁发,大家一起来学习!!! 谢谢各位了!!! unit TranThreadUnit; interface Uses Classes,Windows,StdCtrls,SysUtils,SyncObjs, Messages, Variants, Graphics, Controls, Forms, Dialogs, ExtCtrls, Math; var hiddata:array[0..1000000]of byte;//usb数据缓冲区 Type TUSBTranThread = Class(TThread) //(TThread):初始化一个多线程的程序 private devicehandle,InfoOutPipe,InfoInPipe,MainInPipe:THandle; TotalTimes,NowTime,LastLength:Word; MyOverLapData:OverLapped; // The OVERLAPPED 构造一个信息使用在异步输入或是输入 DeviceName:String; FileName:String; protected procedure Execute;Override; public Constructor Create(UsbDeviceName, SaveFileName: String); end; Var BytesTransfered, PackageNum:Cardinal; StartATrans:Boolean; implementation uses SetupAPI; Constructor TUSBTranThread.Create(UsbDeviceName, SaveFileName: String); begin Inherited Create(False); FreeOnTerminate:=True; DeviceName := UsbDeviceName; //主线程传回设备的路径 FileName := SaveFileName;//主线程传回存盘文件名 end; procedure TUSBTranThread.Execute; // 线程开始工作 label SkipReadLoop; Const EachBulkSize=1024; //数据缓冲区长度 var a:word; l,c:integer; shuzi,getcaps:cardinal;//作为hidp_getcaps函数的返回值 ifatt: THIDD_ATTRIBUTES; ifcaps: THIDP_CAPS; ifphid:Pointer; Data:array[0..EachBulkSize-1] of byte; //数据缓冲区 DataFile:File; EndEvent:TEvent; //结束事件 InfoIn:Array[1..2] of Word; MyCommand:Word; // Len,TranLen, TransLength,i,T:Cardinal; //Cardinal类型 0..4294967295 unsigned(无符号) 32-bit Tr:Boolean; begin devicehandle := CreateFile(PChar(DeviceName),Generic_Write,File_Share_Write,Nil,Open_Existing,0,0); //取得设备的代号 ifatt.size := sizeof(ifatt); HidD_GetAttributes (devicehandle,@ifatt); //取厂商与产品的id HidD_GetPreparsedData(devicehandle,@ifphid); //取得包含设备能力的缓冲区指针 // ifcaps.size := sizeof(ifcaps); getcaps:=HidP_GetCaps(ifphid,@ifcaps); //判断是否取得设备的能力 { if (getcaps=hidp_status_invalid_preparsed_data) then //如果上一个函数返回的是错误的信息给出出错提示 begin with Application do begin NormalizeTopMosts; MessageBox(\'无法取得USB设备的能力!!!\', \'提示!!!\', MB_OK); RestoreTopMosts; end; end; } // if (ifcaps.NumberInputValueCaps=0) then // 上一个函数返回的结构中说明接口内无数据 // begin // with Application do // begin // NormalizeTopMosts; // MessageBox(\'USB设备内无数据!!!\', \'提示!!!\', MB_OK); // RestoreTopMosts; // application.Terminate; // end; // end // else // begin l:=round(ifcaps.NumberInputValueCaps div ifcaps.InputReportByteLength); //要取多少次数据,并确保除数部为零 a:=ifcaps.NumberInputValueCaps mod ifcaps.InputReportByteLength ; //最后一次要取多少数据 // end; //我觉得以上的程序没有问题的 try AssignFile(DataFile,FileName); // (连接的外部文件类型 / 文件名) rewrite(datafile,1); filemode:=2;//datafile类型是可读/写 for c:=0 to l-1 do begin ReadFile(devicehandle,hiddata,ifcaps.InputReportByteLength,i,Nil); //读文件 //ReadFile读回来的数据全时0,问题就在这里 // While(WaitForSingleObject(EndEvent.Handle,100)=Wait_TimeOut) do //判定数据是否读完 (或者是度文件完毕/下在文件超时 毫秒) // begin //append(datafile); //write(datafile,ifcaps.InputReportByteLength ); //?????????????????? blockwrite(datafile,hiddata,i);//应该是i还是ifcaps.InputReportByteLength // end; //?????????????????? end; ReadFile(devicehandle,hiddata,a,i,Nil); //读文件 //ReadFile读回来的数据全时0,问题就在这里 blockwrite(datafile,hiddata,ifcaps.i); closefile(datafile); except // MessageBox(handle,\'文件打开失败\',\'错误\',MB_OK); begin with Application do begin NormalizeTopMosts; MessageBox(\'文件下载失败!!!\', \'提示!!!\', MB_OK); RestoreTopMosts; end; end end; end; end. 问题是readfile取不到数据??? 我觉得应该是在使用readfile函数前还少了什么函数的使用,可是我看到的参考书上都没有,各位大侠,能给我讲讲吗???谢谢了!!! 我刚注册,没多少分,大家原谅!!! |
|
沙发#
发布于:2003-05-27 14:44
WRITEFILE 正常吗?
|
|
板凳#
发布于:2003-05-28 08:52
wirtefile我没有试过,因为硬件还没写到那,所以我编写文件的话也没什么用,
但是我觉的在调用readfile前还少了什么函数调用吧!!! 你觉得呢??? 谢谢你的意见!!! |
|
地板#
发布于:2003-05-28 10:31
如果CREATEFILE 成功可以读的
检查CREATEFILE 和 READFILE 的返回值 |
|
地下室#
发布于:2005-05-12 09:56
如何得USB设备路径名称的?
|
|
5楼#
发布于:2005-06-20 14:08
Hid Report的第一个字节是Report id,填了没有?
|
|