【【召唤:论坛上的大神们都出来吧,还是vc USB的问题】】
有点崩溃,在这个问题上已经花了2个星期了,我觉得需要整理下思路了。纯粹新手,第一次接触USB方面的。
我现在做的是个PC端与单片机的通信程序
单片机(友晶科技的板子)使用的USB chip是:NXP ISP 1761ET, 驱动是windows的通用usb驱动
这就是全部已有的内容。 用USB线连上(板子上是mini USB port),windows 可以正确识别。
在网上找了很多USB的范例,基于其中一个写了代码(后面会附上),先查询GUID 然后检查VID 和 PID来判断是否是正确的设备。
-----------这个已经成功,按下GUI上的按钮,如果板子连上可以找到就显示就成功,反之就显示失败。
然后下一步,写数据。writefile始终返回失败.
用 Bus Hound 检测 对应的USB口,始终没有 IN/OUT put. (使用厂家附带的程序[无源码]一切正常,Bus Hound可以检测到数据)
之前发帖,一类朋友觉得可能是这类设备不能通过writefile发送数据,建议尝试 DeviceIoControl
BOOL WINAPI DeviceIoControl( __in HANDLE hDevice, __in DWORD dwIoControlCode, __in_opt LPVOID lpInBuffer, __in DWORD nInBufferSize, __out_opt LPVOID lpOutBuffer, __in DWORD nOutBufferSize, __out_opt LPDWORD lpBytesReturned, __inout_opt LPOVERLAPPED lpOverlapped);
bool InitUSB() { BOOL bResult; ClassDeviceData =NULL; deviceInfoData.cbSize =sizeof(deviceInfoData); AllusbInfo=::SetupDiGetClassDevs((LPGUID)&DevGuid,NULL,NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if(AllusbInfo== INVALID_HANDLE_VALUE) { AfxMessageBox("Couldn't get handle for HID devices"); return 0; } ////////////////////////////////// HIDCounter = 0; bResult = TRUE; while (bResult) { deviceInfoData.cbSize=sizeof(deviceInfoData); bResult=SetupDiEnumDeviceInterfaces(AllusbInfo,NULL,(LPGUID)&DevGuid,HIDCounter,&deviceInfoData); if (bResult) { requiredLength = 0; predictedLength = 0; bResult=SetupDiGetInterfaceDeviceDetail(AllusbInfo,&deviceInfoData,NULL,0,&requiredLength,NULL); predictedLength=requiredLength; ClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength); ClassDeviceData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); bResult=SetupDiGetInterfaceDeviceDetail(AllusbInfo,&deviceInfoData,ClassDeviceData,predictedLength,&requiredLength,NULL); if (bResult) { for(int i=0;i<17;i++) { ch[i]=*(ClassDeviceData->DevicePath+8+i); } ch[17]='\0'; if (strcmp(ch,"vid_0718&pid_0443")==0)//这个是U盘的 // if (strcmp(ch,"vid_09fb&pid_de30")==0)//这个是板子的 { // free(ClassDeviceData); SetupDiDestroyDeviceInfoList(AllusbInfo); //open port hDevice=CreateFile(ClassDeviceData->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL); if(hDevice== INVALID_HANDLE_VALUE) { AfxMessageBox("Couldn't get handle for devices"); return 0; } return true; } } } HIDCounter = HIDCounter+1; // free(ClassDeviceData); } }
bool WriteUSB() { DWORD NumofBytesRead=0; WriteUsb=CreateFile(ClassDeviceData->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,OPEN_EXISTING,0,NULL); if(WriteUsb== INVALID_HANDLE_VALUE) { AfxMessageBox("Couldn't get handle for devices") return 0; }//till now all goes fine. if (!WriteFile(WriteUsb,"abcd",4,&NumofBytesRead,NULL)) { AfxMessageBox("Failed!"); return false; } else { AfxMessageBox("Success!"); return true; } }