如果你想打开一个USB管道,你首先要知道这种USB设备的GUID和管道名称,获取句柄以后就可以使用ReadFile/WriteFile进行读写了! 以下是代码,请参考!! // filename是管道名称,如pipe01等 int CUSBImpObject::open_file( char *filename) { int successOpened = 0,i; int NumOpened; HANDLE h; NumOpened=OpenAllUsbDevices((LPGUID) &GUID_CLASS_I82930_BULK); if(NumOpened<=0) return 0; for(i=0;i<NumOpened;i++){ strcat (outnamebuf, "//" ); strcat (outnamebuf, filename ); h= CreateFile(outnamebuf, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (h == INVALID_HANDLE_VALUE) { handUsbArray=NULL; } else { handUsbArray=h; successOpened++; } } return successOpened; }
int CUSBImpObject::OpenAllUsbDevices(LPGUID pGuid) //打开所有的GUID为 pGuid的USB器件 { //输出名存在outnamebuf中 ULONG NumberDevices; HANDLE hOut = INVALID_HANDLE_VALUE; //HANDLE Phout[8]; HDEVINFO hardwareDeviceInfo; SP_INTERFACE_DEVICE_DATA deviceInfoData; ULONG i,flag=1,j; ULONG NumDevicesOpened=0; BOOLEAN done; PUSB_DEVICE_DESCRIPTOR usbDeviceInst; PUSB_DEVICE_DESCRIPTOR *UsbDevices = &usbDeviceInst; char DeviceName[256]=""; //器件名
*UsbDevices = NULL; UsbDevicesOpened = 0; //打开器件数置零 hardwareDeviceInfo = SetupDiGetClassDevs ( pGuid, NULL, // Define no enumerator (global) NULL, // Define no (DIGCF_PRESENT | // Only Devices present DIGCF_INTERFACEDEVICE)); // Function class devices. NumberDevices = 4; done = FALSE; deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA); i=0 ; while (!done) { NumberDevices *= 2; if (*UsbDevices) { *UsbDevices = (struct _USB_DEVICE_DESCRIPTOR *)realloc (*UsbDevices, (NumberDevices * sizeof (USB_DEVICE_DESCRIPTOR))); } else { *UsbDevices = (struct _USB_DEVICE_DESCRIPTOR *)calloc (NumberDevices, sizeof (USB_DEVICE_DESCRIPTOR)); } if (NULL == *UsbDevices) { SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); return 0 ; } usbDeviceInst = *UsbDevices + i; for (; i < NumberDevices; i++) { if (SetupDiEnumDeviceInterfaces (hardwareDeviceInfo, 0, pGuid, i, &deviceInfoData)) { hOut = OpenOneDevice (hardwareDeviceInfo, &deviceInfoData, DeviceName); if ( hOut != INVALID_HANDLE_VALUE ) { handUsbArray[UsbDevicesOpened]=hOut; if(!outnamebuf[UsbDevicesOpened]) { return 0; } for(j=0;j<256;j++) { *(outnamebuf[UsbDevicesOpened]+j)=*(DeviceName+j); *(DeviceName+j)=0; } UsbDevicesOpened++; } } else { if(ERROR_NO_MORE_ITEMS == GetLastError()) { done = TRUE; break; } } } //end for } //end while SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); free ( *UsbDevices ); return UsbDevicesOpened ; } //-------------------------------------------------------------------- // // // //-------------------------------------------------------------------- HANDLE CUSBImpObject::OpenOneDevice ( IN HDEVINFO HardwareDeviceInfo, IN PSP_INTERFACE_DEVICE_DATA DeviceInfoData, IN char *devName ) { PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL; ULONG predictedLength = 0; ULONG requiredLength = 0; HANDLE hOut = INVALID_HANDLE_VALUE; SetupDiGetInterfaceDeviceDetail ( HardwareDeviceInfo, DeviceInfoData, NULL, // probing so no output buffer yet 0, // probing so output buffer length of zero &requiredLength, NULL); // not interested in the specific dev-node predictedLength = requiredLength;
functionClassDeviceData =(struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A *) malloc (predictedLength); functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA); if (! SetupDiGetInterfaceDeviceDetail ( HardwareDeviceInfo, DeviceInfoData, functionClassDeviceData, predictedLength, &requiredLength, NULL)) { free( functionClassDeviceData ); return INVALID_HANDLE_VALUE; } strcpy( devName,functionClassDeviceData->DevicePath) ; hOut = CreateFile ( functionClassDeviceData->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, // no SECURITY_ATTRIBUTES structure OPEN_EXISTING, // No special create flags 0, // No special attributes NULL); // No template file if (INVALID_HANDLE_VALUE == hOut) { } free( functionClassDeviceData ); return hOut; }
|