首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

【【召唤:论坛上的大神们都出来吧,还是vc USB的有关问题】】

2012-01-14 
【【召唤:论坛上的大神们都出来吧,还是vc USB的问题】】有点崩溃,在这个问题上已经花了2个星期了,我觉得需要整

【【召唤:论坛上的大神们都出来吧,还是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,
或者,汇编调试一下,厂家程序
[解决办法]
交互的话下位机走的什么通信协议啊?
[解决办法]
探讨
Get Last Error 是 0x00000057;

0x00000057 - ERROR_INVALID_PARAMETER

撇开板子的问题先不谈 我现在用的是U盘 writefile应该是可行的,Bus Hound 应该也能检测到USB口数据的变化才对啊

热点排行