要做一个USB通讯,vc的,该先从何处入手?以前做过串口通讯的,用的vc控件。
解决方案 »
- 'listbox' : undeclared identifier syntax error : identifier 'CListBox'
- c程序员现在找工作,难吗?大家来说说自己的看法,进着有分
- 一个菜鸟问题(希望大家能教教小弟)!
- 请li_zhifu (东北人)或shb80(不认输) 进来,有一个问题请教!
- 微软最新的XML SDK哪里有下载?
- 关于焦点设置的问题,100分相送
- 更换图片问题!
- 用VC连接Oracle数据库,必须采用Thin的方法,可以吗?
- 我公开了一个ApiFunSpy的程序,不过CSDN一直未分布,不知道是怎么回事?
- 请问怎么把一个工程中的对话框加到另外的工程中?
- 请教一下MFC打开数据库的问题
- MFC10.0分隔窗口固定分隔栏问题
HidD_GetHidGuid(&HidGuid);
HDEVINFO hDevInfo;
HANDLE // 准备查找符合HID规范的USB设备
hDevInfo=SetupDiGetClassDevs
(&HidGuid,
NULL,
NULL,
DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);if (hDevInfo == INVALID_HANDLE_VALUE)
{
MessageBox("符合HID规范的USB设备发生错误");
SetupDiDestroyDeviceInfoList(hDevInfo);
return false;
}DWORD MemberIndex = 0;
BOOL bSuccess = false;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);do
{
bSuccess = SetupDiEnumDeviceInterfaces
(hDevInfo, //已安装的HID设备的信息集的句柄
NULL,
&HidGuid, //HID类设备的GUID
MemberIndex, //起始索引号,函数会自动增加
&DeviceInterfaceData); //用以保存单个设备的信息if ((!bSuccess) && (GetLastError() == ERROR_NO_MORE_ITEMS))
{
//if(MemberIndex == 0)
// MessageBox("抱歉,未找到可用的USB HID设备!");
//else
//MessageBox("没有更多的可用的USB HID设备!");
SetupDiDestroyDeviceInfoList(hDevInfo);
hHidHandle=NULL;
bIsHIDCon=false;
return false;
}//若找到了一个USB设备,则获取该设备的细节信息
PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData;
DWORD Length = 0;SetupDiGetDeviceInterfaceDetail(hDevInfo,
&DeviceInterfaceData,
NULL,
0,
&Length,
NULL);pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //MUST BE!!!if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,
&DeviceInterfaceData,
pDeviceInterfaceDetailData,
Length,
NULL,
NULL))
{
MessageBox("查找路径设备时出错!");
DisplayError();
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
}else//先以查询的方式打开设备句柄
hHidHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath ,
0, //0为查询方式,GENERIC_READ | GENERIC_WRITE为读写
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);if (hHidHandle == INVALID_HANDLE_VALUE)
{
MessageBox("无法打开设备");
DisplayError();
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return false;
}
else
{
HIDD_ATTRIBUTES Attributes;
HidD_GetAttributes(hHidHandle,&Attributes);
//将有关该设备的标识显示出来
HIDP_CAPS hidPCaps;
if (Attributes.VendorID == VendorID && Attributes.ProductID == ProductID)
{ //获取设备的权能信息Capabilities.
PHIDP_PREPARSED_DATA pHidpPreparsedData;
/*****************************************************
API函数: HidD_GetPreparsedData
返回: 一个指向缓存区指针,该缓存区包含有设备的权能信息
条件: 由CreateFile返回的句柄.
不需要直接访问缓存区,但HidP_GetCaps和其它API函数需要一个.
********************************************************/
if (!HidD_GetPreparsedData(hHidHandle,&pHidpPreparsedData))
{
MessageBox("获取 HID PREPARED DATA 失败!");
MessageBox("获取 HID 错误!");
DisplayError();
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return false;
}
NTSTATUS status = HidP_GetCaps(pHidpPreparsedData,&hidPCaps);
if (status == HIDP_STATUS_SUCCESS)
{
//以UsagePage和Usage ID判断,这个需要先定出来
if( hidPCaps.UsagePage==UsagePage && hidPCaps.Usage==UsageID )
{
//找到设备后则以读写的方式打开以进行操作
CloseHandle(hHidHandle);
hHidHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath ,
GENERIC_READ | GENERIC_WRITE, //0为查询方式,GENERIC_READ | GENERIC_WRITE为读写
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
strHIDPath=pDeviceInterfaceDetailData->DevicePath;
/*
此处进行操作
*/
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return true;
}
}
}//释放句柄资源
CloseHandle(hHidHandle);
}MemberIndex++;
} while(bSuccess);
上位机设备驱动相对简单,因为usbd.sys总线驱动已经为我们完成了很多工作,第一次做可以参照ddk例子改个~
个人经验觉得首要还需理解usb2.0协议,USB Complete有时间也最好看看,对usb相关的GUID,注册表讲得很好~
有的话发我:[email protected]
谢谢!!!