C++访问USB接口
<p><br/>下面是访问 USB 口必备的函数: #include <vcl.h></p><p>#include <dir.h><br/>#include <setupapi.h><br/>#include "C:/WINDDK/3790/inc/ddk/w2k/usbdi.h"<br/>#include "C:/WINDDK/3790/inc/ddk/w2k/devioctl.h"<br/>#include <initguid.h><br/>//---------------------------------------------------------------------------<br/>// 下面必须为驱动程序的 GUID 值, 这里我乱写的数<br/>DEFINE_GUID(USB_DRIVER_GUID, 0x12345678,0xabcd,0x1122,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00);<br/>//---------------------------------------------------------------------------<br/>HANDLE OpenOneDevice(HDEVINFO hDvcInfo, PSP_INTERFACE_DEVICE_DATA DvcInfoData, char *sDevNameBuf)<br/>{<br/>HANDLE hOut = INVALID_HANDLE_value;</p><p>ULONG iReqLen = 0;<br/>SetupDiGetInterfaceDeviceDetail(hDvcInfo, DvcInfoData, NULL, 0, &iReqLen, NULL);</p><p>ULONG iDevDataLen = iReqLen; //sizeof(SP_FNCLASS_DEVICE_DATA) + 512;<br/>PSP_INTERFACE_DEVICE_DETAIL_DATA pDevData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(iDevDataLen);</p><p>pDevData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);<br/>if(SetupDiGetInterfaceDeviceDetail(hDvcInfo, DvcInfoData, pDevData, iDevDataLen, &iReqLen, NULL))<br/>{<br/>strcpy(sDevNameBuf, pDevData->DevicePath);<br/>hOut = CreateFile(pDevData->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);<br/>}</p><p>free(pDevData);<br/>return hOut;<br/>}<br/>//---------------------------------------------------------------------------<br/>HANDLE OpenUsbDevice(const GUID *pGuid, char *sDevNameBuf)<br/>{<br/>HANDLE hOut = INVALID_HANDLE_value;</p><p>HDEVINFO hDevInfo = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);</p><p>SP_INTERFACE_DEVICE_DATA deviceInfoData;<br/>deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);</p><p>ULONG nGuessCount = MAXLONG;<br/>for(ULONG iDevIndex=0; iDevIndex<nGuessCount; iDevIndex++)<br/>{<br/>if(SetupDiEnumDeviceInterfaces(hDevInfo, 0, pGuid, iDevIndex, &deviceInfoData))<br/>{<br/>if((hOut=OpenOneDevice(hDevInfo, &deviceInfoData, sDevNameBuf)) != INVALID_HANDLE_value)<br/>break;<br/>}<br/>else if(GetLastError() == ERROR_NO_MORE_ITEMS) //No more items<br/>{<br/>break;<br/>}<br/>}<br/>SetupDiDestroyDeviceInfoList(hDevInfo);<br/>return hOut;<br/>}<br/>//---------------------------------------------------------------------------<br/>bool GetUsbDeviceFileName(const GUID *pGuid, char *sDevNameBuf)<br/>{<br/>HANDLE hDev = OpenUsbDevice(pGuid, sDevNameBuf);<br/>if(hDev != INVALID_HANDLE_value)<br/>{<br/>CloseHandle(hDev);<br/>return true;<br/>}<br/>return false;<br/>}<br/>//---------------------------------------------------------------------------<br/>HANDLE OpenMyDevice()<br/>{<br/>char DeviceName = "";<br/>return OpenUsbDevice(&USB_DRIVER_GUID, DeviceName);<br/>}<br/>//---------------------------------------------------------------------------<br/>HANDLE OpenMyDevPipe(const char *PipeName)<br/>{<br/>char DeviceName = "";<br/>if(GetUsbDeviceFileName(&USB_DRIVER_GUID, DeviceName))<br/>{<br/>strcat(DeviceName,"\\");<br/>strcat(DeviceName,PipeName);<br/>return CreateFile(DeviceName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);<br/>}<br/>return INVALID_HANDLE_value;<br/>}<br/>//---------------------------------------------------------------------------<br/>有了上面的函数就可以访问 USB 口了://打开 USB 口读写, 由驱动程序的 Pipe 名确定 </p><p>HANDLE hPipe = OpenMyDevPipe("MyPipe1"); //驱动程序里面的 Pipe 名, 对应访问某个端点的 I/O, 这里我乱写的, 需要与驱动一致<br/>if(hPipe != INVALID_HANDLE_value) //打开 Pipe 成功<br/>{<br/>ReadFile(hPipe, Buffer, BufSize, &nBytesRead, NULL); //从 hPipe 里读取数据到 Buffer 里<br/>//WriteFile(hPipe, Buffer, BytesToWrite, &nBytesWritten, NULL); //把 Buffer 里面的 BytesToWrite 字节写入 hPipe<br/>CloseHandle(hPipe);<br/>}</p><p>//使用 DeviceIoControl 访问 USB 设备</p><p>HANDLE hDevice = OpenMyDevice();<br/>if(hDevice != INVALID_HANDLE_value) //打开设备成功<br/>{<br/>//这些 DeviceIoControl 功能
页:
[1]