日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

用VC++实现USB接口读写数据的程序

發(fā)布時(shí)間:2025/5/22 c/c++ 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用VC++实现USB接口读写数据的程序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
使用一個(gè)GUIDguidHID_1查找并打開一個(gè)USB設(shè)備 extern "C" int PASCAL SearchUSBDevice() {HANDLE hUsb;int nCount, i, j;//標(biāo)記同一設(shè)備個(gè)數(shù)HDEVINFO hDevInfoSet;BOOL bResult;PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL;memset(m_sysversion, 0, 20);GetSysVersion(m_sysversion);// 檢索相關(guān)GUID的USB設(shè)備總設(shè)備個(gè)數(shù)if (!GetUSBList()){return 0;}// 取得一個(gè)該GUID相關(guān)的設(shè)備信息集句柄hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE, // class GUID NULL, // 無關(guān)鍵字 NULL, // 不指定父窗口句柄 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的設(shè)備// 失敗...if (hDevInfoSet == INVALID_HANDLE_VALUE){return NULL;}// 申請(qǐng)?jiān)O(shè)備接口數(shù)據(jù)空間nCount = 0;bResult = TRUE;for (i=0; i< 34; i++){bDeviceOpen[i] = FALSE;memset(m_DeviceDesc[i], 0, 256);}SP_DEVICE_INTERFACE_DATA ifdata;// 設(shè)備序號(hào)=0,1,2... 逐一測試設(shè)備接口,到失敗為止while (bResult){ifdata.cbSize = sizeof(ifdata);// 枚舉符合該GUID的設(shè)備接口bResult = ::SetupDiEnumDeviceInterfaces(hDevInfoSet, // 設(shè)備信息集句柄NULL, // 不需額外的設(shè)備描述(LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE, // GUID(ULONG)nCount, // 設(shè)備信息集里的設(shè)備序號(hào)&ifdata); // 設(shè)備接口信息if (bResult){ULONG predictedLength = 0;ULONG requiredLength = 0;// 取得該設(shè)備接口的細(xì)節(jié)(設(shè)備路徑)bResult = SetupDiGetInterfaceDeviceDetail(hDevInfoSet, // 設(shè)備信息集句柄&ifdata, // 設(shè)備接口信息NULL, // 設(shè)備接口細(xì)節(jié)(設(shè)備路徑)0, // 輸出緩沖區(qū)大小&requiredLength, // 不需計(jì)算輸出緩沖區(qū)大小(直接用設(shè)定值)NULL); // 不需額外的設(shè)備描述// 取得該設(shè)備接口的細(xì)節(jié)(設(shè)備路徑)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, // 設(shè)備信息集句柄&ifdata, // 設(shè)備接口信息pDetail, // 設(shè)備接口細(xì)節(jié)(設(shè)備路徑)predictedLength, // 輸出緩沖區(qū)大小&requiredLength, // 不需計(jì)算輸出緩沖區(qū)大小(直接用設(shè)定值)NULL); // 不需額外的設(shè)備描述if (bResult){// 復(fù)制設(shè)備路徑到輸出緩沖區(qū)//::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)//比較版本號(hào),防止意外出錯(cuò){memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ; memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ; READ_OS.hEvent = CreateEvent( NULL, // no securityTRUE, // explicit reset reqFALSE, // initial event resetNULL ) ; // no nameif (READ_OS.hEvent == NULL) {break;}WRITE_OS.hEvent = CreateEvent( NULL, // no securityTRUE, // explicit reset reqFALSE, // initial event resetNULL ) ; // no nameif (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在哪個(gè)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;}}// 比較驅(qū)動(dòng)版本}// 比較操作系統(tǒng)版本else{memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ; memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ; READ_OS.hEvent = CreateEvent( NULL, // no securityTRUE, // explicit reset reqFALSE, // initial event resetNULL ) ; // no nameif (READ_OS.hEvent == NULL) {break;}WRITE_OS.hEvent = CreateEvent( NULL, // no securityTRUE, // explicit reset reqFALSE, // initial event resetNULL ) ; // no nameif (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; } } } } } // 釋放設(shè)備接口數(shù)據(jù)空間 ::GlobalFree(pDetail);// 關(guān)閉設(shè)備信息集句柄 ::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 recoverClearCommError(m_gphdCom[index],&dwErrorFlags, &ComStat ) ;break;}}}else // end-----if (GetLastError() == ERROR_IO_PENDING){// some other error occurreddwLength = 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; }

總結(jié)

以上是生活随笔為你收集整理的用VC++实现USB接口读写数据的程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩乱码一区二区三区 | av三级在线播放 | 色av一区 | 性欧美1819性猛交 | 女人天堂网 | 国产一二区在线 | 色综合五月婷婷 | 欧美激情一区二区三区 | 尹人久久 | 尤物一区二区 | 日本一区二区精品 | 三上悠亚久久精品 | 中文字幕一区二区三区四区免费看 | 欧美一区2区三区4区公司 | 在线不卡一区二区 | 亚洲av无码一区二区三区四区 | 97超碰在线播放 | 色欲无码人妻久久精品 | 国产伦精品一区二区三区视频孕妇 | 日韩欧美亚洲视频 | 欧美特级毛片 | 精品少妇3p | 亚洲欧美中文日韩在线观看 | 特级西西444www高清大胆 | 成人依人 | 久久久久久久久久91 | 免费成人结看片 | 国产a级精品 | 欧美xxxx网站 | 欧美性免费 | 五月婷婷色综合 | 一级日韩片 | 久久国产精品免费视频 | 一本色道久久综合亚洲二区三区 | 国产精品国产精品国产 | 美女扒开腿让男人捅 | 亚洲综合色网 | 中文字幕在线有码 | 欧美日韩国产第一页 | 精品免费av | 天天看夜夜看 | 在线天堂中文在线资源网 | 亚洲区在线播放 | 亚洲熟妇av一区二区三区漫画 | 丰满女邻居的色诱4hd | 成人羞羞在线观看网站 | 午夜精品福利视频 | 成人黄色免费 | 日韩中文字幕亚洲精品欧美 | 日韩女优一区 | 夜夜操夜夜爱 | 亚洲国产激情 | 国产精品午夜一区二区 | 精品人妻一区二区三区香蕉 | 国产精品毛片一区二区在线看 | 日韩不卡的av | 亚洲国产精品久久AV | 亚洲理论在线观看 | 国产精品毛片一区二区在线看舒淇 | 在线观看久草 | 中文字幕有码视频 | 久草免费av| 91伦理视频| 亚洲色图视频在线观看 | 视频在线观看免费大片 | 精品视频久久久久久 | av观看在线免费 | 国产乱淫视频 | 国产91在线免费观看 | 亚洲精品国产精品乱码桃花 | 日韩视频播放 | 超碰最新在线 | 国产91精品看黄网站在线观看 | 丰满岳乱妇一区二区三区 | 深夜视频在线看 | 亚洲激情文学 | 少妇高潮毛片色欲ava片 | 波多野结衣精品在线 | 日韩视频a| 国产精品手机视频 | 91插插插影库永久免费 | 日本免费一级片 | 另类综合小说 | 成人在线观看国产 | 国产一区二区三区视频在线播放 | 精品人妻一区二区三区四区五区 | 国产白丝喷水 | 美国一级特黄 | 探花视频在线观看 | av在线影音 | 91av在 | www.超碰97 | 四虎永久在线 | 日韩一级免费看 | 黄色国产在线播放 | 伊人焦久影院 | jizz性欧美2 视频在线日韩 | 在线欧美日韩国产 | 色播日韩 |