下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译环境: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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 零售业企业战略规划实施考核试卷
- 锡冶炼过程中的自动化设备应用考核试卷
- 汽车工程与车载仪器考核试卷
- 肉类副产品加工新技术在降低成本中的应用考核试卷
- 弹簧在汽车发动机正时链条张紧器中的应用考核试卷
- 审计工作中的心理学考核试卷
- 薯类作物种植经济效益分析考核试卷
- 拖拉机动力电池管理与维护考核试卷
- 2024年度贵州省安全员之B证(项目负责人)基础试题库和答案要点
- 2024年度甘肃省安全员之B证(项目负责人)综合练习试卷B卷附答案
- 二年级乘除法口算题计算练习大全2000题(可直接打印)
- 数学-湖北省鄂东南省级示范高中教育教学改革联盟学校2022-2023学年高一上学期期中联考
- 2024年贵州省乡村振兴政策知识考试题库(含答案)
- 23年11月14日江苏省南京鼓楼八上语文期中【学生】
- 《工程制图基础》课件
- 正确使用词语(实词、虚词)课件
- 广东省广州市2024届普通高中毕业班综合测试(一)英语试题含答案
- 温室气体排放量统计表全套范本
- 5.40.38火灾自动报警系统应急广播扬声器和警报装置安装质量标准和检验方法(完)
- 智能制造中的预测性维护
- 新概念英语第2册课文(完整版)
评论
0/150
提交评论