用VC++实现USB接口读写数据的程序
2012-01-17 15:41
295 查看
使用一个GUIDguidHID_1查找并打开一个USB设备
[/code]
(本文来自:http://bbs.ednchina.com/BLOG_ARTICLE_14969.HTML)
申明:未加转载说明即为原创文章,转载请注明:
转自Roboby's Home 链接:用VC++实现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); GetSysVersion(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_HANDLE_VALUE) { return NULL; } // 申请设备接口数据空间 nCount = 0; bResult = TRUE; for (i=0; i< 34; i++) { bDeviceOpen[i] = FALSE; memset(m_DeviceDesc[i], 0, 256); } SP_DEVICE_INTERFACE_DATA ifdata; // 设备序号=0,1,2... 逐一测试设备接口,到失败为止 while (bResult) { ifdata.cbSize = sizeof(ifdata); // 枚举符合该GUID的设备接口 bResult = ::SetupDiEnumDeviceInterfaces( hDevInfoSet, // 设备信息集句柄 NULL, // 不需额外的设备描述 (LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE, // GUID (ULONG)nCount, // 设备信息集里的设备序号 &ifdata); // 设备接口信息 if (bResult) { ULONG predictedLength = 0; ULONG requiredLength = 0; // 取得该设备接口的细节(设备路径) bResult = SetupDiGetInterfaceDeviceDetail( hDevInfoSet, // 设备信息集句柄 &ifdata, // 设备接口信息 NULL, // 设备接口细节(设备路径) 0, // 输出缓冲区大小 &requiredLength, // 不需计算输出缓冲区大小(直接用设定值) NULL); // 不需额外的设备描述 // 取得该设备接口的细节(设备路径) predictedLength=requiredLength; // if(pDetail) // { // pDetail =NULL; // } pDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength); pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); bResult = SetupDiGetInterfaceDeviceDetail( hDevInfoSet, // 设备信息集句柄 &ifdata, // 设备接口信息 pDetail, // 设备接口细节(设备路径) predictedLength, // 输出缓冲区大小 &requiredLength, // 不需计算输出缓冲区大小(直接用设定值) NULL); // 不需额外的设备描述 if (bResult) { // 复制设备路径到输出缓冲区 //::strcpy(pszDevicePath[nCount], pDetail->DevicePath); if (strcmp(m_sysversion, "winnt")==0) { char ch[18]; for(i=0;i<17;i++){ ch[i]=*(pDetail->DevicePath+8+i); } ch[17]='\0'; if (strcmp(ch,"vid_0471&pid_0666")==0)//比较版本号,防止意外出错 { memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ; memset( &WRITE_OS, 0, sizeof( 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 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上 char id[30]; memset(id, 0, 30); i=0; do { id[i]=*(pDetail->DevicePath+26+i); i++; } while(id[i-1]!='#'); id[i-1] = '\0'; for (j=0; j<34; j++) { if(strcmp(id, m_USBList[j])==0) { sprintf(m_DeviceDesc[j+1], "%s", pDetail->DevicePath); m_USBPositionMap[nCount] = j+1; break; } } CloseHandle(hUsb); nCount++; // break; } }// 比较驱动版本 }// 比较操作系统版本 else { memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ; memset( &WRITE_OS, 0, sizeof( 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 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) { if(strcmp(pDetail->DevicePath, m_USBList[j])==0) { sprintf(m_DeviceDesc[j+1], "%s", pDetail->DevicePath); m_USBPositionMap[nCount] = j+1; break; } CloseHandle(hUsb); nCount++; // break; } } } } } // 释放设备接口数据空间 ::GlobalFree(pDetail); // 关闭设备信息集句柄 ::SetupDiDestroyDeviceInfoList(hDevInfoSet); iDeviceCount = nCount; return nCount; } // 写 BOOL Writestr(char *buf,int 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 sendpacket[65]; BYTE xorcode="0x00"; if (m_gphdCom[index] == NULL) // no usb device(jk100c) { return -1; } div_result = div(buflen, 58); if (div_result.rem == 0) { packet = div_result.quot; } else { packet = div_result.quot+1; } for (i=0; i<packet; i++) { memset(sendpacket, 0, 65); if(i==packet-1) { // end packet if (div_result.rem == 0) { len = 58; } else { len = div_result.rem; } } else { len = 58; } sendpacket[0] = 0x13; sendpacket[1] = 3+len; sendpacket[2] = 0x01; sendpacket[3] = packet*16+i+1; memcpy(sendpacket+4, buf+(i*58), len); for(j=0;j<len+3;j++) { xorcode^=sendpacket[j+1]; } sendpacket[len+4] = (char)xorcode; sendpacket[len+5] = 0x23; PurgeComm(m_gphdCom[index],PURGE_RXCLEAR|PURGE_TXCLEAR); // Sleep(10); fWriteStat = WriteFile(m_gphdCom[index], sendpacket, len+6,&ret, NULL); if (!fWriteStat) { if(GetLastError() == ERROR_IO_PENDING) { dwError = GetLastError(); // an error occurred, try to recover wsprintf( szError, "\n\r <CE-%u>", dwError ) ; OutputDebugString(szError); ClearCommError(m_gphdCom[index], &dwErrorFlags, &ComStat ) ; if (dwErrorFlags >0) { wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ; OutputDebugString(szError); } } else { // some other error occurred ClearCommError(m_gphdCom[index], &dwErrorFlags, &ComStat ) ; if (dwErrorFlags > 0) { wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ; OutputDebugString(szError); } return FALSE; } } if (i != packet-1) { // should be receive ack if (ReceivePacketAnswer(index) != 0) { return FALSE; } } } return TRUE; } // 读 int Readstr(char *buf,int nMaxLength, int index) { BOOL fReadStat ; COMSTAT ComStat; DWORD dwErrorFlags; DWORD dwLength; DWORD dwError; char szError[ 10 ]; if (fCOMMOpened==0) { return FALSE; //串口未打开 } // only try to read number of bytes in queue ClearCommError(m_gphdCom[index], &dwErrorFlags, &ComStat) ; //dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue ) ; dwLength=nMaxLength; if (dwLength > 0) { if (olap==TRUE) { fReadStat = ReadFile(m_gphdCom[index],buf, dwLength, &dwLength,&READ_OS) ; if (!fReadStat) { if (GetLastError() == ERROR_IO_PENDING) { OutputDebugString("\n\rIO Pending"); while(!GetOverlappedResult(m_gphdCom[index], &READ_OS, &dwLength, TRUE )) { dwError = GetLastError(); if(dwError == ERROR_IO_INCOMPLETE) continue; else { // an error occurred, try to recover ClearCommError(m_gphdCom[index],&dwErrorFlags, &ComStat ) ; break; } } } else // end-----if (GetLastError() == ERROR_IO_PENDING) { // some other error occurred dwLength = 0 ; ClearCommError(m_gphdCom[index], &dwErrorFlags, &ComStat ) ; if (dwErrorFlags >0) { wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ; OutputDebugString(szError); } } } // end-----if (!fReadStat) } // end-----if (olap==TRUE) else { fReadStat = ReadFile( m_gphdCom[index],buf, dwLength, &dwLength, NULL ) ; if (!fReadStat) { dwError = GetLastError(); ClearCommError(m_gphdCom[index],&dwErrorFlags, &ComStat ) ; if (dwErrorFlags >0) { wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ; OutputDebugString(szError); } } PurgeComm(m_gphdCom[index],PURGE_RXCLEAR|PURGE_TXCLEAR); } } return dwLength; }
[/code]
(本文来自:http://bbs.ednchina.com/BLOG_ARTICLE_14969.HTML)
申明:未加转载说明即为原创文章,转载请注明:
转自Roboby's Home 链接:用VC++实现USB接口读写数据的程序
相关文章推荐
- 用VC++实现USB接口读写数据的程序
- 用VC++实现USB接口读写数据的程序
- VC读写注册表实现程序自启动的实现源代码
- 怎样编写一个在USB接口读写数据的程序
- VC读写注册表实现程序自启动的实现源代码
- Project数据读写小程序(一)
- 写一段Jdbc连Oracle的程序,并实现数据查询
- 谈一谈:抽象工厂+反射+配置文件 实现数据访问程序
- pipe,父子进程实现读写交换数据(linux)
- 微信小程序ajax实现请求服务器数据,模版遍历数据
- 从MySQL导入导出大量数据的程序实现方法
- dsp控制DM9000实现802.3数据收发第三篇,调试过程程序第三版;采用外部引脚中断方式获取中断,优化掉帧现象
- 使用SharedPreferences来实现判断程序是不是第一次运行和临时保存数据
- C语言二进制文件读写程序实现(基础)
- winform程序两个窗体间同步数据(一): 静态变量和线程实现
- 获取其他程序的信息(VC实现)
- 栈实现内存单元内容改写程序中数据
- Python StringIO模块(或Six.BytesIO()模块)实现在内存缓冲区中读写数据
- Java基于字符流形式读写数据的两种实现方法示例
- VC++实现host文件读写