USB应用程序开发.doc_第1页
USB应用程序开发.doc_第2页
USB应用程序开发.doc_第3页
USB应用程序开发.doc_第4页
USB应用程序开发.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

USB应用程序开发 1 前言USB开发跟其他文件设备(如串口)开发一样,难点是找到该USB设备的路径,本文以DDK里src/usb/bulkusb例子为参考,阐述一个非HID的USB调试器软件的开发过程。2 设备GUID一般设备会有两个GUID, 一个为Class GUID, 在INF文件中,另一个为Device GUID,在SYS文件中。 CreateFile使用的是SYS中的GUID,想得到它有两个办法: 1 跟设备的提供者索要。 2在注册表里找,一般在:HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/DeviceClasses/3 设备路径根据设备GUID,枚举所有USBHOST,找匹配的USB设备,然后获取其路径。3.1 头文件 usbport.h#define WINVER 0x0500#include #include #include #include #include #include #pragma comment(lib,setupapi.lib)#pragma comment(lib,hid.lib)#pragma comment(lib,comctl32.lib)#ifndef BULKUSBH_INC#define BULKUSBH_INC#define BULKUSB_IOCTL_INDEX0x0000#define IOCTL_BULKUSB_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN,/ BULKUSB_IOCTL_INDEX,/ METHOD_BUFFERED,/ FILE_ANY_ACCESS) #define IOCTL_BULKUSB_RESET_DEVICE CTL_CODE(FILE_DEVICE_UNKNOWN,/ BULKUSB_IOCTL_INDEX+1,/ METHOD_BUFFERED,/ FILE_ANY_ACCESS) #define IOCTL_BULKUSB_RESET_PIPECTL_CODE(FILE_DEVICE_UNKNOWN,/ BULKUSB_IOCTL_INDEX+2,/ METHOD_BUFFERED,/ FILE_ANY_ACCESS) extern HANDLE open_file(char *filename);extern int GetUsbPath(char *path);extern int WriteUsb(HANDLE hUsb,char *Outbuff, int len);extern int ReadUsb(HANDLE hUsb,BYTE inbuff,DWORD &nBytesRead,int nToRead);3.2 源文件 usbport.cpp#include usbport.h/8a3bf75d-83c7-440e-8276-5ae3f3ea6e77DEFINE_GUID(GUID_CLASS_I82930_BULK,0x8a3bf75d, 0x83c7, 0x440e,0x82, 0x76, 0x5a, 0xe3, 0xf3, 0xea, 0x6e, 0x77);BOOL GetUsbDeviceFileName( LPGUIDpGuid, char *outNameBuf);HANDLE OpenUsbDevice( LPGUIDpGuid, char *outNameBuf);HANDLE OpenOneDevice (HDEVINFOHardwareDeviceInfo, PSP_INTERFACE_DEVICE_DATA DeviceInfoData,char *devName);int GetUsbPath(char *path);int WriteUsb(HANDLE hUsb,char *Outbuff, int len);int ReadUsb(HANDLE hUsb,BYTE inbuff, DWORD &nBytesRead,int nToRead);/*名称:open_file功能:打开USB设备参数:filename 定义为”PIPE00” pipe name for bulk input pipe on our test board,”PIPE01” pipe name for bulk output pipe on our test board。PIPE00 和 PIPE01是参考src/usb/bulkusb,我实际在用时这两个效果一样,为了避免USB异常引起的死机,我文件打开采用非阻塞模式。*/HANDLE open_file( char *filename) int success = 1; HANDLE h; char completeDeviceName256 = ;/generated from the GUID registered by the driver itself if ( !GetUsbDeviceFileName(LPGUID) &GUID_CLASS_I82930_BULK,completeDeviceName) ) /NOISY(Failed to GetUsbDeviceFileName/n, GetLastError(); returnINVALID_HANDLE_VALUE; strcat (completeDeviceName, /); strcat (completeDeviceName, filename); /printf(completeDeviceName = (%s)/n, completeDeviceName); h = CreateFile(completeDeviceName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if (h = INVALID_HANDLE_VALUE) /NOISY(Failed to open (%s) = %d, completeDeviceName, GetLastError(); success = 0; else /NOISY(Opened successfully./n); return h;/*名称:GetUsbDeviceFileName功能:获取USB设备路径参数:pGUID返回:outNameBuf USB设备路径*/BOOL GetUsbDeviceFileName( LPGUIDpGuid, char *outNameBuf) HANDLE hDev = OpenUsbDevice( pGuid, outNameBuf ); if ( hDev != INVALID_HANDLE_VALUE ) CloseHandle( hDev ); return TRUE; return FALSE;/*名称:OpenUsbDevice功能:获取USB设备路径参数:pGUID 设备GUID返回:outNameBuf USB设备路径*/HANDLE OpenUsbDevice( LPGUIDpGuid, char *outNameBuf) ULONG NumberDevices; HANDLE hOut = INVALID_HANDLE_VALUE; HDEVINFO hardwareDeviceInfo; SP_INTERFACE_DEVICE_DATA deviceInfoData; ULONG i; BOOLEAN done; PUSB_DEVICE_DESCRIPTOR usbDeviceInst; PUSB_DEVICE_DESCRIPTOR *UsbDevices = &usbDeviceInst; *UsbDevices = NULL; NumberDevices = 0; / / Open a handle to the plug and play dev node. / SetupDiGetClassDevs() returns a device information set that contains info on all / installed devices of a specified class. / hardwareDeviceInfo = SetupDiGetClassDevs ( pGuid, NULL, / Define no enumerator (global) NULL, / Define no (DIGCF_PRESENT | / Only Devices present DIGCF_INTERFACEDEVICE); / Function class devices. / / Take a wild guess at the number of devices we have; / Be prepared to realloc and retry if there are more than we guessed / NumberDevices = 4; done = FALSE; deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA); i=0; while (!done) NumberDevices *= 2; if (*UsbDevices) *UsbDevices = (PUSB_DEVICE_DESCRIPTOR)realloc (*UsbDevices, (NumberDevices * sizeof (USB_DEVICE_DESCRIPTOR); else *UsbDevices = (PUSB_DEVICE_DESCRIPTOR)calloc (NumberDevices, sizeof (USB_DEVICE_DESCRIPTOR); if (NULL = *UsbDevices) / SetupDiDestroyDeviceInfoList destroys a device information set / and frees all associated memory. SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); return INVALID_HANDLE_VALUE; usbDeviceInst = *UsbDevices + i; for (; i 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, / no SECURITY_ATTRIBUTES structure OPEN_EXISTING, / No special create flags 0, / No special attributes NULL); / No template file if (INVALID_HANDLE_VALUE = hOut) /printf( FAILED to open %s/n, devName ); free( functionClassDeviceData ); return hOut;/*名称:GetUsbPath功能:返回USB设备路径参数:pGUID返回:path 路径*/int GetUsbPath(char *path) if ( !GetUsbDeviceFileName(LPGUID) &GUID_CLASS_I82930_BULK,path) ) return0; return 1;/*名称:WriteUsb功能:向USB写数据参数:hUsb USB句柄,Outbut 数据指针,len 数据长度*/int WriteUsb(HANDLE hUsb,char *Outbuff, int len) DWORD nBytesWrite,endtime,lrc; static OVERLAPPED ol; DWORD dwErrorMask,dwError; COMSTAT comstat; if(hUsb=NULL) return 0; ol.Offset=0;/设备使用指定0 ol.OffsetHigh=0;/设备使用指定0 ol.hEvent=NULL; /标识事件为非信号状态,数据传送完成时,它将被设为信号状态 ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); if(!WriteFile(hUsb,Outbuff,len,&nBytesWrite,&ol) /出错信息处理- if(lrc=GetLastError()=ERROR_IO_PENDING) endtime=GetTickCount()+1000; while(!GetOverlappedResult(hUsb,&ol,&nBytesWrite,FALSE) dwError=GetLastError(); if(GetTickCount()endtime) MessageBox(NULL,写串口时间过长,目前串口发送缓冲区中的数据数目为空,NULL,NULL); break; if(dwError=ERROR_IO_INCOMPLETE) continue; /未完全读完时的正常返回结果 else / 发生错误,尝试恢复! break; /-/ CloseHandle(ol.hEvent); FlushFileBuffers(hUsb); return 1;/*名称:ReadUsb功能:读取USB设备发来的数据参数:hUsb USB句柄,nToRead读取的长度返回:inbuff 读到的数据,nBytesRead读到的长度*/int ReadUsb(HANDLE hUsb,BYTE inbuff, DWORD &nBytesRead,int nToRead) DWORD lrc; /纵向冗余校验 DWORD endtime; /jiesuo static OVERLAPPED ol;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论