【【召唤:论坛上的大神们都出来吧,还是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
- C/C++ code
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);
关于dwIoControlCode,不知如何得到,询问厂家了,目前为止还没有答复。
至此。后来进行了其他尝试,把GUID ,VID PID 换成了一个对应U盘的值,成功找到设备,写入时还是失败。
所以问题应该不是班子那里,估计是代码的问题了 我觉得问题可能出在 creatfile 这类的地方了,但没有发现.
关于GUID,注册表里面 ENUM/USB/板子对应的vid&pid/1.00/Device Parameter/里面找的
\??\USB#Vid_09fb&Pid_de30#1.00#{a5dcbf10-6530-11d2-901f-00c04fb951ed} 应该是没有问题的
下面附上代码
- C/C++ code
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); } }
////////////////////////////////////Writting Part///////////////////////////////////////
- C/C++ code
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; } } 不知道表达的是不是很清楚,先谢谢各位大大了。。。。
[解决办法]
dwIoControlCode应该是你自已定义的值.
[解决办法]
不懂,帮顶哈~~~~
[解决办法]
学习,帮顶
[解决办法]
先在WriteFile下GetLastError(),看下返回失败的错误是啥...
[解决办法]
一般厂家都会提供接口读写数据你看下有没有啥文档说明之类的...
[解决办法]
找厂家解决,提供调用接口或者代码.
[解决办法]
找厂家提供sdk,
或者,汇编调试一下,厂家程序
[解决办法]
交互的话下位机走的什么通信协议啊?
[解决办法]