




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档-下载后可编辑C++Builder访问USB口的方法-基础电子编译环境:BorlandC++Builder6.0,WindowsServer2022DDK
运行环境:Win98/2000/XP/2022
下面是访问USB口必备的函数:
#includevcl.h
#includedir.h
#includesetupapi.h
#include"C:/WINDDK/3790/inc/ddk/w2k/usbdi.h"
#include"C:/WINDDK/3790/inc/ddk/w2k/devioctl.h"
#includeinitguid.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;
ULONGiReqLen=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;iDevIndexnGuessCount;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\\Vid_厂家标识Pid_产品
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 银行入营考试试题及答案
- 电工三基考试试题及答案
- 公务员逻辑测试题及答案
- 行政诉讼公务员考试题及答案
- 《广义相对论讲》课件 - 探索引力与时空的奥秘
- 2025-2030中国办公椅行业供需分析及发展潜力前景研究报告
- 2025-2030中国冰皮月饼行业供需分析及发展前景研究报告
- 2025《餐饮加盟合同范本》
- 2025福建龙岩农业发展有限公司及所属企业公开招聘(遴选)工作人员5人笔试参考题库附带答案详解
- 2025二手房购房合同范本下载
- 咯血-护理查房课件
- 公路工程施工现场安全检查手册
- 黄河上游历史大洪水市公开课金奖市赛课一等奖课件
- 激光跟踪仪使用手册
- 马家河金矿选矿试验报告
- 货物采购服务方案
- 图纸答疑格式
- DB11-T 1322.64-2019 安全生产等级评定技术规范 第64部分:城镇供水厂
- 《普通生物学教案》word版
- 2017年最新普速铁路接触网运行维修规则
- FZ∕T 64085-2021 非织造用纤维网帘
评论
0/150
提交评论