C+++Builder+访问+USB+口的方法_第1页
C+++Builder+访问+USB+口的方法_第2页
C+++Builder+访问+USB+口的方法_第3页
C+++Builder+访问+USB+口的方法_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译环境:BorlandC++Builder6.0,WindowsServer2003DDK

运行环境:Win98/2000/XP/2003

下面是访问USB口必备的函数:#include<vcl.h>

#include<dir.h>

#include<setupapi.h>

#include"C:/WINDDK/3790/inc/ddk/w2k/usbdi.h"

#include"C:/WINDDK/3790/inc/ddk/w2k/devioctl.h"

#include<initguid.h>

//---------------------------------------------------------------------------

//下面必须为驱动程序的GUID值,这里我乱写的数

DEFINE_GUID(USB_DRIVER_GUID,0x12345678,0xabcd,0x1122,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00);

//---------------------------------------------------------------------------

HANDLEOpenOneDevice(HDEVINFOhDvcInfo,PSP_INTERFACE_DEVICE_DATADvcInfoData,char*sDevNameBuf)

{

HANDLEhOut=INVALID_HANDLE_VALUE;

ULONG

iReqLen=0;

SetupDiGetInterfaceDeviceDetail(hDvcInfo,DvcInfoData,NULL,0,&iReqLen,NULL);

ULONGiDevDataLen=iReqLen;//sizeof(SP_FNCLASS_DEVICE_DATA)+512;

PSP_INTERFACE_DEVICE_DETAIL_DATApDevData=(PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(iDevDataLen);

pDevData->cbSize=sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);

if(SetupDiGetInterfaceDeviceDetail(hDvcInfo,DvcInfoData,pDevData,iDevDataLen,&iReqLen,NULL))

{

strcpy(sDevNameBuf,pDevData->DevicePath);

hOut=CreateFile(pDevData->DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

}

free(pDevData);

returnhOut;

}

//---------------------------------------------------------------------------

HANDLEOpenUsbDevice(constGUID*pGuid,char*sDevNameBuf)

{

HANDLEhOut=INVALID_HANDLE_VALUE;

HDEVINFOhDevInfo=SetupDiGetClassDevs(pGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);

SP_INTERFACE_DEVICE_DATAdeviceInfoData;

deviceInfoData.cbSize=sizeof(SP_INTERFACE_DEVICE_DATA);

ULONGnGuessCount=MAXLONG;

for(ULONGiDevIndex=0;iDevIndex<nGuessCount;iDevIndex++)

{

if(SetupDiEnumDeviceInterfaces(hDevInfo,0,pGuid,iDevIndex,&deviceInfoData))

{

if((hOut=OpenOneDevice(hDevInfo,&deviceInfoData,sDevNameBuf))!=INVALID_HANDLE_VALUE)

break;

}

elseif(GetLastError()==ERROR_NO_MORE_ITEMS)//Nomoreitems

{

break;

}

}

SetupDiDestroyDeviceInfoList(hDevInfo);

returnhOut;

}

//---------------------------------------------------------------------------

boolGetUsbDeviceFileName(constGUID*pGuid,char*sDevNameBuf)

{

HANDLEhDev=OpenUsbDevice(pGuid,sDevNameBuf);

if(hDev!=INVALID_HANDLE_VALUE)

{

CloseHandle(hDev);

returntrue;

}

returnfalse;

}

//---------------------------------------------------------------------------

HANDLEOpenMyDevice()

{

charDeviceName[MAXPATH]="";

returnOpenUsbDevice(&USB_DRIVER_GUID,DeviceName);

}

//---------------------------------------------------------------------------

HANDLEOpenMyDevPipe(constchar*PipeName)

{

charDeviceName[MAXPATH]="";

if(GetUsbDeviceFileName(&USB_DRIVER_GUID,DeviceName))

{

strcat(DeviceName,"\\");

strcat(DeviceName,PipeName);

returnCreateFile(DeviceName,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);

}

returnINVALID_HANDLE_VALUE;

}

//---------------------------------------------------------------------------

有了上面的函数就可以访问USB口了://打开USB口读写,由驱动程序的Pipe名确定

HANDLEhPipe=OpenMyDevPipe("MyPipe1");//驱动程序里面的Pipe名,对应访问某个端点的I/O,这里我乱写的,需要与驱动一致

if(hPipe!=INVALID_HANDLE_VALUE)//打开Pipe成功

{

ReadFile(hPipe,Buffer,BufSize,&nBytesRead,NULL);//从hPipe里读取数据到Buffer里

//WriteFile(hPipe,Buffer,BytesToWrite,&nBytesWritten,NULL);//把Buffer里面的BytesToWrite字节写入hPipe

CloseHandle(hPipe);

}

//使用DeviceIoControl访问USB设备

HANDLEhDevice=OpenMyDevice();

if(hDevice!=INVALID_HANDLE_VALUE)//打开设备成功

{

//这些DeviceIoControl功能都是由设备定义的,具体看设备和驱动的资料

if(DeviceIoControl(hDevice,IOCTL_READ_xxxx,&IOBlock,sizeof(IOBLOCK),&c,1,&nBytes,NULL))

{

//成功

}

CloseHandle(hDevice);

}

USB设备、USB驱动、USB应用程序

1.USB设备硬件部分

a.这个硬件的标识是用的VenderID和ProductID,即“厂家标识”和“产品标识”

b.这个硬件规定了各个EndPoint(端点)的性质,读/写及类型(Control/Interrupt/Bulk/Isochronous)

c.这个硬件的固件里面有DeviceIoControl的实现部分,规定了这个函数的具体参数和动作2.USB设备驱动

①硬件接口

a.需要识别VenderID和ProductID

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.VenderID,ProductID和GUID一般在驱动程序的.inf文件里面能看到,如果找不到就需要和厂家联系

b.Pipe的名字是驱动程序规定的,需要有驱动程序的资料才能知道

c.DeviceIoControl的参数需要有驱动程序的资料或者硬件资料才能知道

③这个程序一般用C/C++直接编写,如果使用其他语言(VB/PB等)需要调用C/C++编的DLL

其他相关内容:

USB驱动程序可以到注册表里面找到:

"HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Enum\\USB\\Vi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论