关于USB通信的问题,求高手帮忙
最近在研究USB通信的问题,
编程实现了通过GUID得到USB File Transfer的GUID,CreateFile也返回有效的句柄,但接下来WriteFile总是返回FALSE,GetLastError()为6。
参考的是这个例子
http://topic.csdn.net/u/20090521/18/3f1b3848-0839-4bab-ab5b-01a8cb383cea.html
改例子中有一段:
HANDLE hPipe = OpenMyDevPipe("MyPipe1"); //驱动程序里面的 Pipe 名, 对应访问某个端点的 I/O, 这里我乱写的, 需要与驱动一致
if(hPipe != INVALID_HANDLE_VALUE) //打开 Pipe 成功
{
ReadFile(hPipe, Buffer, BufSize, &nBytesRead, NULL); //从 hPipe 里读取数据到 Buffer 里
//WriteFile(hPipe, Buffer, BytesToWrite, &nBytesWritten, NULL); //把 Buffer 里面的 BytesToWrite 字节写入 hPipe
CloseHandle(hPipe);
}
提到Pipe名要与驱动一致。我现在安装了这个USB通信线的驱动,我如何得到这个Pipe名呢?
接下来一段也提到用DeviceIoControl 必须看驱动说明,目前我已经向厂商问清楚,这个USB线的芯片是:GL620USB-A,我也从网上下载了GL620USB-A的说明文件,但是还是无法从里面提炼出 Pipe名和DeviceIoControl的参数。
有经验的高手是否能给小弟一点提示。万分感谢!
附程序源码和芯片说明文档下载地址:
#include <ObjBase.h>
#include <initguid.h>
DEFINE_GUID(HidGuid, 0xf18a0e88,0xc30c,0x11d0,0x88,0x15,0x00,0xa0,0xc9,0x06,0xbe,0xd8);
void main(int argc, char* argv[])
{
printf("Hello World!\n");
char MyDevPathName[1024]={0};
HDEVINFO hDevInfoSet;
DWORD MemberIndex = 0;
BOOL Result;
SP_DEVICE_INTERFACE_DATA DevInterfaceData;
DWORD RequiredSize;
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetailData;
HANDLE hDevHandle;
HANDLE hReadHandle = INVALID_HANDLE_VALUE;
HANDLE hWriteHandle = INVALID_HANDLE_VALUE;
HIDD_ATTRIBUTES DevAttributes;
DevInterfaceData.cbSize = sizeof(DevInterfaceData);
DevAttributes.Size = sizeof(DevAttributes);
hDevInfoSet = SetupDiGetClassDevs(&HidGuid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
while (1)
{
Result = SetupDiEnumDeviceInterfaces(hDevInfoSet, NULL, &HidGuid, MemberIndex, &DevInterfaceData);
if (!Result)
break;
MemberIndex++;
Result = SetupDiGetDeviceInterfaceDetail(hDevInfoSet, &DevInterfaceData, NULL, NULL, &RequiredSize, NULL);
pDevDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize);
if (pDevDetailData == NULL)
{
SetupDiDestroyDeviceInfoList(hDevInfoSet);
return;
}
pDevDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SP_DEVINFO_DATA did = {sizeof(SP_DEVINFO_DATA)};
Result = SetupDiGetDeviceInterfaceDetail(hDevInfoSet, &DevInterfaceData, pDevDetailData, RequiredSize, NULL, &did);
strcpy(MyDevPathName,pDevDetailData->DevicePath);
if (!strstr(MyDevPathName,"3ab45e4d"))
{
continue;
}
TCHAR fname[256];
if(!SetupDiGetDeviceRegistryProperty(hDevInfoSet,&did,SPDRP_FRIENDLYNAME,NULL,(PBYTE) fname,sizeof(fname),NULL)
&& !SetupDiGetDeviceRegistryProperty(hDevInfoSet,&did,SPDRP_DEVICEDESC,NULL,(PBYTE) fname,sizeof(fname),NULL))
strcpy(fname,pDevDetailData->DevicePath);
if(!SetupDiGetDeviceRegistryProperty(hDevInfoSet,&did,SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,NULL,(PBYTE) fname,sizeof(fname),NULL)
&& !SetupDiGetDeviceRegistryProperty(hDevInfoSet,&did,SPDRP_DEVICEDESC,NULL,(PBYTE) fname,sizeof(fname),NULL))
strcpy(fname,pDevDetailData->DevicePath);
free(pDevDetailData);
if (Result == FALSE)
continue;
hDevHandle = CreateFile(MyDevPathName, NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDevHandle != INVALID_HANDLE_VALUE)
{
strcat(MyDevPathName,"\\PIPE02");
hWriteHandle = CreateFile(MyDevPathName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
if (hWriteHandle != INVALID_HANDLE_VALUE)
{
BOOL PortReadyWrite = true;
unsigned char check_link[] = "HELLOWORLD";
BOOL result;
OVERLAPPED overlapped;
DWORD number;
overlapped.Offset = 0;
overlapped.OffsetHigh = 0;
result = WriteFile(hWriteHandle, check_link, sizeof(check_link), &number, &overlapped);
DWORD dwError = GetLastError();
}
}
}
SetupDiDestroyDeviceInfoList(hDevInfoSet);
return;
}
http://datasheet.digchip.com/589/589-00008-0-GL620-A.pdf
(文件可先下载再看)
相关推荐
linux下USB通信程序
linux下USB通信程序,可实现主机和开发板之间的usb连接通信!
Labview 与USB设备通信
Labview 与USB设备(HID)通过visa通信 http://bbs.elecfans.com/jishu_515959_1_1.html 基于LabView与单片机USB通讯问题 http://bbs.elecfans.com/jishu_519961_1_1.html LabVIEW与USB设备直接通信 https://jingyan.baidu.com/article/af...
学习STM32的USB通信
学习STM32的USB通信需要掌握的内容包括以下几个部分:USB基础知识、STM32 USB库的使用、USB设备工作模式的选择、USB设备描述符的配置、USB传输的实现。接下来将会详细介绍这些内容,并附上相关的示例代码。二、STM32 USB库的使用 ST公司提供了丰富的USB库,可在STM32微控制器上实现USB通信功能。使用前需要下载并安装对应的USB库文件。三、USB设备工作模式的选择。四、USB设备描述符的配置。五、USB传输的实现。
Android USB通信
1.说在前面的话 这次做了一个项目,要求android端与外接设备进行通信,用到的是otg线连接开发板。然而网上有关USB host通信的资料很少,这里我就把自己的想法以及遇到的坑说一下吧()。 2.Android Studio 配置 2.1Manifest配置
qt usb通信
上位机采用qt技术做界面,用开源libusb做驱动与下位机的usb进行通信,测试良好


