新手上路,关于USB口读写程序,请各位大虾赐教! 我需要用VC写一段USB口读写程序,各位大虾可否给于提点,不胜感谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HANDLE OpenDevice(LPGUID pGuid, char *outNameBuf){HANDLE hOut = INVALID_HANDLE_VALUE;HDEVINFO hardwareDeviceInfo;SP_INTERFACE_DEVICE_DATA deviceInfoData;hardwareDeviceInfo = SetupDiGetClassDevs (pGuid, NULL, NULL, (DIGCF_PRESENT | DIGCF_INTERFACEDEVICE));deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);if (SetupDiEnumDeviceInterfaces (hardwareDeviceInfo, 0, pGuid, 0, &deviceInfoData)){hOut = OpenOneDevice (hardwareDeviceInfo, &deviceInfoData, outNameBuf);if (hOut==INVALID_HANDLE_VALUE)return INVALID_HANDLE_VALUE;}DWORD reErr = GetLastError( );SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);return hOut;}HANDLE OpenOneDevice(HDEVINFO HardwareDeviceInfo, PSP_INTERFACE_DEVICE_DATA DeviceInfoData, char *devName){PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL;ULONG predictedLength = 0;ULONG requiredLength = 0;HANDLE hOut = INVALID_HANDLE_VALUE;// allocate a function class device data structure to receive the goods about this particular device.SetupDiGetInterfaceDeviceDetail (HardwareDeviceInfo, DeviceInfoData, NULL, 0, &requiredLength, NULL);predictedLength = requiredLength;// sizeof (SP_FNCLASS_DEVICE_DATA) + 512;functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc (predictedLength);functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);// Retrieve the information from Plug and Play.if (!SetupDiGetInterfaceDeviceDetail(HardwareDeviceInfo,DeviceInfoData,functionClassDeviceData,predictedLength,&requiredLength,NULL)){free(functionClassDeviceData);return INVALID_HANDLE_VALUE;}strcpy(devName,functionClassDeviceData->DevicePath);printf("Attempting to open %s\n", devName);hOut = CreateFile (functionClassDeviceData->DevicePath,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if (INVALID_HANDLE_VALUE == hOut)printf("FAILED to open %s\n", devName);free(functionClassDeviceData);return hOut;}HANDLE hDEV = OpenDevice((LPGUID)&GUID_BUS_UMSS, completeDeviceName);if (hDEV==INVALID_HANDLE_VALUE)return;DeviceIoControl (hDEV,IOCTL_Vender_VCMD_WRITE,buf,31, //CBWbuf,13, // Data + CSW(LPDWORD)&nBytes,NULL);上面的OpenDevice函数就是演示如何根据设备GUID打开一个USB接口的设备,和设备读写通讯的时候就需要了解设备的驱动到底都支持什么方式了。可以使用UsbView工具查看USB设备到底支持几个Endpoint,每个都以什么方式读写。如果你的设备支持3个EndPoint,0号是控制的,1号是读,2号是写,那你直接读取0号Endpoint,搞不好就会发生重起的问题。仔细看看DDK中的一些例子代码可以解决你的问题。 我想问问,在opendevice的时候,你怎么知道completedevicename,这个comletedevicename是设备路径+\\*****,什么啊 UDP只允许一包一包接收,还是可以调用recvfrom一次接收多个包? 获取进程快照问题 急,问一个在VC中将绘制图形打印出来的问题? 高兴 散分 这个程序输出结果是否一定?理由? 一个关于edit box 控件的拷贝,粘贴奇怪的为题!谢谢! 求一个C++编写的自动压缩指定文件夹的程序 谢谢! COM的问题?HELP 在win2000里如何访问别的程序的内存? 添加一个 别人写的类文件:a.cpp;a.h 后编译 出错:error c1010->(初学者)谢谢 《c++ primer》 中的程序为何在 vc中编译通不过? 关于dumpbin
{
HANDLE hOut = INVALID_HANDLE_VALUE;
HDEVINFO hardwareDeviceInfo;
SP_INTERFACE_DEVICE_DATA deviceInfoData;hardwareDeviceInfo = SetupDiGetClassDevs (pGuid, NULL, NULL, (DIGCF_PRESENT | DIGCF_INTERFACEDEVICE));deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);if (SetupDiEnumDeviceInterfaces (hardwareDeviceInfo, 0, pGuid, 0, &deviceInfoData))
{
hOut = OpenOneDevice (hardwareDeviceInfo, &deviceInfoData, outNameBuf);if (hOut==INVALID_HANDLE_VALUE)
return INVALID_HANDLE_VALUE;
}DWORD reErr = GetLastError( );SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);return hOut;
}HANDLE OpenOneDevice(HDEVINFO HardwareDeviceInfo, PSP_INTERFACE_DEVICE_DATA DeviceInfoData, char *devName)
{
PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL;
ULONG predictedLength = 0;
ULONG requiredLength = 0;
HANDLE hOut = INVALID_HANDLE_VALUE;// allocate a function class device data structure to receive the goods about this particular device.
SetupDiGetInterfaceDeviceDetail (HardwareDeviceInfo, DeviceInfoData, NULL, 0, &requiredLength, NULL);predictedLength = requiredLength;
// sizeof (SP_FNCLASS_DEVICE_DATA) + 512;functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc (predictedLength);
functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);// Retrieve the information from Plug and Play.
if (!SetupDiGetInterfaceDeviceDetail(
HardwareDeviceInfo,
DeviceInfoData,
functionClassDeviceData,
predictedLength,
&requiredLength,
NULL))
{
free(functionClassDeviceData);
return INVALID_HANDLE_VALUE;
}strcpy(devName,functionClassDeviceData->DevicePath);
printf("Attempting to open %s\n", devName);hOut = CreateFile (functionClassDeviceData->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);if (INVALID_HANDLE_VALUE == hOut)
printf("FAILED to open %s\n", devName);free(functionClassDeviceData);return hOut;
}
HANDLE hDEV = OpenDevice((LPGUID)&GUID_BUS_UMSS, completeDeviceName);
if (hDEV==INVALID_HANDLE_VALUE)
return;DeviceIoControl (
hDEV,
IOCTL_Vender_VCMD_WRITE,
buf,
31, //CBW
buf,
13, // Data + CSW
(LPDWORD)&nBytes,
NULL
);
上面的OpenDevice函数就是演示如何根据设备GUID打开一个USB接口的设备,和设备读写通讯的时候就需要了解设备的驱动到底都支持什么方式了。可以使用UsbView工具查看USB设备到底支持几个Endpoint,每个都以什么方式读写。
如果你的设备支持3个EndPoint,0号是控制的,1号是读,2号是写,那你直接读取0号Endpoint,搞不好就会发生重起的问题。仔细看看DDK中的一些例子代码可以解决你的问题。