求个 delphi USB通讯的例子,实现简单的发送,接收数据
1,在网上看到可以用 SetupAPI.pas类单元进行通讯,但我下载的好像函数不是很全;
希望各位大大可以提供一个完整点的SetupAPI.pas的下载地址,要求可以实现以上功能;
2,再网上看牛人说可以用filecreate等API函数编写,第一次接触这么底层的东西求,给个思路!

解决方案 »

  1.   

    USB芯片厂商一般都会提供上位机通信接口函数吧。
      

  2.   

    USB有很多种芯片,编程接口完全不同
      

  3.   

    我现在手头就只有通信协议,然后资料上说是简单的USB通讯,usb的通信应该是相同的吧
      

  4.   

    USB芯片厂商一般都会提供上位机通信接口函数吧。
      

  5.   

    不同的USB设备,读取数据的接口真的是不同的,楼主可不能把它理解成简单的U盘
      

  6.   

    应该就是简单的 U盘的USB通信吧,这个您说说的读取诗句的接口是厂家提供的吗?
    但我在网上有搜到关于usb通信的文章 他也没说需要接口 信息什么的  只是利用了 setupapi.pas来做的 如果把问题简单化 只是简单的U盘通信应该如何做?
      

  7.   

    这是我在网上 找到的一个关于此方面的代码:
    但里面有一些函数我却不能找到:
    procedure TUsbUtil.Close; 
    begin 
         CloseHandle(hUsbHandle); 
    end; function TUsbUtil.Open(usbguid: String): boolean; 
    var 
       DeviceName: array[0..MAX_PATH] of char; 
       USB_GUID   : TGUID; 
    begin 
           Result := false; 
           USB_GUID := StringToGuid('{' + usbguid + '}'); 
           hUsbHandle := OpenUsbDevice(USB_GUID, DeviceName); 
           if (hUsbHandle = INVALID_HANDLE_VALUE) then 
           begin 
             raise Exception.Create('无法打开指定的USB设备'); 
           end; 
           Result := True; 
    end; function TUsbUtil.OpenOneDevice(hDvcInfo: HDEVINFO; 
       DvcInfoData: PSPDeviceInterfaceData; sDevNameBuf: pchar): THandle; 
    var 
    iReqLen :pdword; 
    iDevDataLen : DWord; 
    pDevData : PSPDeviceInterfaceDetailDataA ; 
    hOut: THandle; 
    begin 
       hOut := INVALID_HANDLE_VALUE; 
       iReqLen := pdword(integer(0));    SetupDiGetDeviceInterfaceDetail(hDvcInfo,DvcInfoData, nil, 0, @iReqLen, nil); 
       iDevDataLen := DWORD(integer(iReqLen)); 
       GetMem(pDevData, iDevDataLen); 
       pDevData.cbSize := sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); 
       if (SetupDiGetInterfaceDeviceDetail(hDvcInfo, DvcInfoData, pDevData, iDevDataLen, @iReqLen, nil)) then 
       begin 
         strcopy(sDevNameBuf, pDevData.DevicePath); 
         hOut := CreateFile(pDevData.DevicePath,GENERIC_WRITE or GENERIC_READ, FILE_SHARE_WRITE or FILE_SHARE_READ, nil,OPEN_EXISTING,0,0); 
       end; 
       FreeMem(pDevData); 
       Result := hOut; 
    end; function TUsbUtil.OpenUsbDevice(pGuid: TGUID; sDevNameBuf: pchar): THandle; 
    var 
       hDevInfo1 : HDEVINFO; 
       deviceInfoData : TSPDeviceInterfaceData ; 
       nGuessCount : Dword; 
       iDevIndex :DWord; 
       hOut: THandle; 
    begin 
       hDevInfo1 := SetupDiGetClassDevs(@pGuid, nil,0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);    deviceInfoData.cbSize := sizeof(TSPDeviceInterfaceData); 
       nGuessCount := MAXLONG; 
       for iDevIndex :=0 to nGuessCount do 
       begin 
         if(SetupDiEnumDeviceInterfaces(hDevInfo1,nil,pGuid,iDevIndex,deviceInfoData)) then 
         begin 
             hOut := OpenOneDevice(hDevInfo1, @deviceInfoData, sDevNameBuf); 
             if (hOut <> INVALID_HANDLE_VALUE) then 
             begin 
               break; 
             end 
             else if (GetLastError() = ERROR_NO_MORE_ITEMS) then 
             begin 
               break; 
             end; 
         end; 
       end; 
       SetupDiDestroyDeviceInfoList(hDevInfo1); 
       Result := hOut; 
    end; 
    function TUsbUtil.ReadBytes: TDataBuffer; 
    var 
       nBytesReaded:LongWord; 
       bs: TDataBuffer; 
    begin 
         ReadFile(self.hUsbHandle,bs.DataBuffer,MAX_DATA_BUFFER, nBytesReaded, nil); 
         bs.DataSize :=   nBytesReaded; 
         Result := bs; 
    end; procedure TUsbUtil.WriteBytes(bs: TDataBuffer); 
    var 
       nBytesWritten:LongWord; 
    begin 
       WriteFile(self.hUsbHandle, bs.DataBuffer, bs.DataSize, nBytesWritten, nil); 
    end; end. 有了上面的类就可以与USB设备进行通讯了 
    procedure TUsbUtil.Test; 
    var 
         bs:TDataBuffer; 
         objUsb:TUsbUtil; 
    begin 
       objUsb :=   TUsbUtil.Create(); 
    //打开USB设备,参数是驱动程序的GUID值, 这里我乱写的数 
    objUsb.Open('A5DCBF10-6530-11D2-901F-00C04FB951ED'); 
    //写入数据 
    bs.DataBuffer[0] := $1B; 
    bs.DataBuffer[1] := $10; 
    bs.DataBuffer[2] := $00; 
    bs.DataBuffer[3] := $00; 
    bs.DataBuffer[4] := $05; 
    bs.DataBuffer[5] := $44; 
    bs.DataBuffer[6] := $D0; 
    bs.DataSize := 7; 
    objUsb.WriteBytes(bs); 
    //读取数据 
    bs := objUsb.ReadBytes(); 
    //关闭设备 
    objUsb.Close(); 
    end; 
    USB 设备、USB 驱动、USB 应用程序 1.USB 设备硬件部分 
       a.这个硬件的标识是用的 Vender ID 和 Product ID, 即“厂家标识”和“产品标识” 
       b.这个硬件规定了各个 End Point (端点) 的性质, 读/写 及 类型 (Control/Interrupt/Bulk/Isochronous) 
       c.这个硬件的固件里面有 DeviceIoControl 的实现部分, 规定了这个函数的具体参数和动作 
    2.USB 设备驱动 
    ①硬件接口 
       a.需要识别 Vender ID 和 Product ID 
       b.对每个 EndPoint 的每个 I/O 分配一个 Pipe, 并且起一个名字作为软件接口 
       c.做 DeviceIoControl 的接口 
    ②软件接口 
       a.GUID, 驱动程序的标识, 每个驱动程序使用不同的 GUID, GUID 是识别驱动的, 与硬件无关 (驱动程序升级版本 GUID 不能修改) 
       b.硬件接口里面的 b: Pipe 名字是软件接口, 这个 Pipe 名字纯粹由驱动定义的, 和硬件无关, 升级驱动不能改 Pipe 的名字 
       c.硬件接口里面的 c 的各个参数也是软件的接口, 这些参数是由硬件带来的, 不是驱动规定的, 当然也可以在驱动里面转义, 隐藏设备的真实情况 
    ③这个驱动程序是用 WinDDK 编译的, 可以用文本编辑器或其他开发工具的编辑器编程序代码, 然后调用 WinDDK 编译 3.读写 USB 口的程序 
    ①与驱动的接口 
       a.利用驱动程序里面的 GUID 找出设备的文件名, 用 CreateFile 函数打开设备。我前面的程序里面的 OpenUsbDevice 就是这个作用 
       b.通过 a.得到的设备文件名和驱动程序里面的 Pipe 名打开 Pipe, 访问这个 Pipe 对应的 USB 端点 (读写数据) 
       c.使用 a.的 CreateFile 得到的句柄, 通过 DeviceIoControl 实现设备规定的动作 
    ②有关需要的资料 
       a.Vender ID, Product ID 和 GUID 一般在驱动程序的 .inf 文件里面能看到, 如果找不到就需要和厂家联系 
       b.Pipe 的名字是驱动程序规定的, 需要有驱动程序的资料才能知道 
       c.DeviceIoControl 的参数需要有驱动程序的资料或者硬件资料才能知道 
    ③这个程序一般用 C/C++ 直接编写, 如果使用其他语言(VB/PB等)需要调用 C/C++ 编的 DLL 
    其他相关内容: USB 驱动程序可以到注册表里面找到: 
    "HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Enum\\USB\\Vid_厂家标识&Pid_产品标识\\驱动程序" 里面的 ClassGUID 就是驱动程序的 GUID 标识, 例如 {36FC9E60-C465-11CF-8056-444553540000} 
    相当于程序的: DEFINE_GUID(USB_DRIVER_GUID, 0x36FC9E60,0xC465,0x11CF,0x80,0x56,0x44,0x45,0x53,0x54,0x00,0x00); 
    另外在这个注册表键里面还可找到有关设备的其他描述, 例如 DeviceDesc = "USB Mass Storage Device" 等
    红色代码部分 我都没有找到我下载的setupapi.pas里找到相应函数
      

  8.   

    上面的函数找到了 我另外下了个setupapi.pas 但是存在一个问题编译时提示
    SetupDiGetDeviceInterfaceDetail(hDvcInfo,DvcInfoData, nil, 0, @iReqLen, nil);这一行 形参与实参不一致!求高手!求解!
      

  9.   

    不同厂家的产品,通讯协议不同,楼主还是省省吧,赶紧想办法找厂家联系。
    现在的USB产品,很多厂家为保证兼容性,用户层都已经不是标准USB接口的了,如模拟键盘口、串口、打印口等。
      

  10.   

    假设是标准的USB接口 怎么才能做到呢 ?
      

  11.   

    你好!我最近也在做delphi的USB通信,想问一下你的问题解决了吗?可以正常通信了吗