discoveryer3000
驱动牛犊
驱动牛犊
  • 注册日期2003-05-27
  • 最后登录2003-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1609回复:5

各位高手留步!!!在hid类编程中遇见一个奇怪的问题!!!

楼主#
更多 发布于:2003-05-27 13:08
我刚注册,没多少分,大家原谅!!!
我在编写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函数前还少了什么函数的使用,可是我看到的参考书上都没有,各位大侠,能给我讲讲吗???谢谢了!!!
我刚注册,没多少分,大家原谅!!!
lpwnd
驱动小牛
驱动小牛
  • 注册日期2003-03-04
  • 最后登录2012-01-20
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-27 14:44
WRITEFILE 正常吗?
discoveryer3000
驱动牛犊
驱动牛犊
  • 注册日期2003-05-27
  • 最后登录2003-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-28 08:52
wirtefile我没有试过,因为硬件还没写到那,所以我编写文件的话也没什么用,
但是我觉的在调用readfile前还少了什么函数调用吧!!!
你觉得呢???
谢谢你的意见!!!
lpwnd
驱动小牛
驱动小牛
  • 注册日期2003-03-04
  • 最后登录2012-01-20
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-28 10:31
如果CREATEFILE 成功可以读的
检查CREATEFILE 和 READFILE 的返回值
junki
驱动牛犊
驱动牛犊
  • 注册日期2004-09-02
  • 最后登录2007-11-30
  • 粉丝0
  • 关注0
  • 积分124分
  • 威望13点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-12 09:56
如何得USB设备路径名称的?
leehan
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2016-10-11
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-06-20 14:08
Hid Report的第一个字节是Report id,填了没有?
游客

返回顶部