1、用VC+实现USB接口读写数据的程序讲述用VC+实现USB接口读写数据的程序2009-08-15 11:55用VC+实现USB接口读写数据的程序 使用一个GUIDguidHID_1查找并打开一个USB设备 extern C int PASCAL SearchUSBDevice() HANDLE hUsb; int nCount, i, j;/标记同一设备个数 HDEVINFO hDevInfoSet; BOOL bResult; PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL; memset(m_sysversion, 0, 20); GetSys
2、Version(m_sysversion); / 检索相关GUID的USB设备总设备个数 if (!GetUSBList() return 0; / 取得一个该GUID相关的设备信息集句柄 hDevInfoSet = :SetupDiGetClassDevs(LPGUID)&guidHID_1,/GUID_CLASS_USB_DEVICE, / class GUID NULL, / 无关键字 NULL, / 不指定父窗口句柄 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); / 目前存在的设备 / 失败. if (hDevInfoSet = INVALID_HAN
3、DLE_VALUE) return NULL; / 申请设备接口数据空间 nCount = 0; bResult = TRUE; for (i=0; icbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); bResult = SetupDiGetInterfaceDeviceDetail( hDevInfoSet, / 设备信息集句柄 &ifdata, / 设备接口信息 pDetail, / 设备接口细节(设备路径) predictedLength, / 输出缓冲区大小 &requiredLength, / 不需计算输出缓冲区大小(直接用设定值)
4、NULL); / 不需额外的设备描述 if (bResult) / 复制设备路径到输出缓冲区 /:strcpy(pszDevicePathnCount, pDetail-DevicePath); if (strcmp(m_sysversion, winnt)=0) char ch18; for(i=0;iDevicePath+8+i); ch17=0; if (strcmp(ch,vid_0471&pid_0666)=0)/比较版本号,防止意外出错 memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ; memset( &WRITE_OS, 0, sizeo
5、f( OVERLAPPED ) ) ; READ_OS.hEvent = CreateEvent( NULL, / no security TRUE, / explicit reset req FALSE, / initial event reset NULL ) ; / no name if (READ_OS.hEvent = NULL) break; WRITE_OS.hEvent = CreateEvent( NULL, / no security TRUE, / explicit reset req FALSE, / initial event reset NULL ) ; / no
6、name if (NULL = WRITE_OS.hEvent) CloseHandle( READ_OS.hEvent ); break; hUsb=CreateFile(pDetail-DevicePath,/&guidHID_1,/ GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL/*| FILE_FLAG_OVERLAPPED*/, NULL); if (hUsb != NULL) / 比较定位找到的USB在哪个USB PORT
7、上 char id30; memset(id, 0, 30); i=0; do id=*(pDetail-DevicePath+26+i); i+; while(id!=#); id = 0; for (j=0; jDevicePath); m_USBPositionMapnCount = j+1; break; CloseHandle(hUsb); nCount+; / break; / 比较驱动版本 / 比较操作系统版本 else memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ; memset( &WRITE_OS, 0, sizeof( OVER
8、LAPPED ) ) ; READ_OS.hEvent = CreateEvent( NULL, / no security TRUE, / explicit reset req FALSE, / initial event reset NULL ) ; / no name if (READ_OS.hEvent = NULL) break; WRITE_OS.hEvent = CreateEvent( NULL, / no security TRUE, / explicit reset req FALSE, / initial event reset NULL ) ; / no name if
9、 (NULL = WRITE_OS.hEvent) CloseHandle( READ_OS.hEvent ); break; hUsb=CreateFile(pDetail-DevicePath,/&guidHID_1,/ GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL/*| FILE_FLAG_OVERLAPPED*/, NULL); if (hUsb != NULL) if(strcmp(pDetail-DevicePath,
10、m_USBListj)=0) sprintf(m_DeviceDescj+1, %s, pDetail-DevicePath); m_USBPositionMapnCount = j+1; break; CloseHandle(hUsb); nCount+; / break; / 释放设备接口数据空间 :GlobalFree(pDetail); / 关闭设备信息集句柄 :SetupDiDestroyDeviceInfoList(hDevInfoSet); iDeviceCount = nCount; return nCount; / 写 BOOL Writestr(char *buf,int
11、buflen, int index) BOOL fWriteStat; DWORD dwErrorFlags; DWORD dwError; COMSTAT ComStat; char szError 10 ; DWORD ret; int len, i, j, packet; div_t div_result; BYTE sendpacket65; BYTE xorcode=0x00; if (m_gphdComindex = NULL) / no usb device(jk100c) return -1; div_result = div(buflen, 58); if (div_result.rem = 0) packet = div_result.quot; else pack
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1