首先使用CreateFile打开USB端口,CreateFile函数会返回一个HANDLE类型的句柄,该句柄可以用于下述的ReadFile和WriteFile之间的操作。
这是最关键的一步是如何获取devicePathName, 幸好windows提供了解决的方法,
使用SetupDiGetClassDevs方法, 关于该方法在MSDN有非常详细的解答:
详细请参考以下网址:
<https://msdn.microsoft.com/en-us/library/windows/hardware/ff551069(v=vs.85).aspx>
如果想要获取详细的错误信息,通过调用GetLastError可以获取。同时如果想要调用远程计算机上的设备的时候请使用SetupDiGetClassDevsEx。当调用SetupDiGetClassDevs成功后,调用SetupDiEnumDeviceInterface方法,枚举包含在设备信息集中的设备接口(enum the device information contained in the device详细请参考下述网址:https://msdn.microsoft.com/en-us/library/windows/hardware/ff551015(v=vs.85).aspx
// 第一次调用SetupDiGetDeviceInterfaceDetail方法后返回SP_DEVICE_INTERFACE_DETAIL_DATA的buffer大小
SP_DEVICE_INTERFACE_DETAIL_DATA detailBufferData;
detailBufferData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); // 如果指定了这个参数,那么在使用之前必须设置cbSize参数的大小
SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, // &detailBufferData, // SP_DEVICE_INTERFACE_DETAIL_DATA指针用来接收指定interface的信息 requiredSize, // 上一次调用后返回的SP_DEVICE_INTERFACE_DETAIL_DATA的buffer大小 &requiredSize, // 返回DeviceInterfaceDetailData的buffer 大小 NULL );
如果SetupDiDeviceInterfaceDetail调用成功,detailBufferData包含有USB设备的路径信息。
}
关于SetupDiGetInterfaceDetail方法的详细请参考下述网址
<https://msdn.microsoft.com/en-us/library/windows/hardware/ff551120(v=vs.85).aspx>
还有一个非常重要的结构体需要介绍下。
SP_DEVICE_INTERFACE_DETAIL_DATA
关于详细的资料可以参考以下网址:
<https://msdn.microsoft.com/en-us/library/windows/hardware/ff552343(v=vs.85).aspx>
/*
调用SetupDiGetClassDevs方法后,请调用SetupDiEnumDeviceInfo方法。该方法返回的SP_DEVINFO_DATA结构体指定了device information set集合中的设备元素信息。
*/
然后是读写USB设备,这有好几种方法,这里介绍两种:
①:ReadFile和WriteFile;
②:使用winusb_readpipe和winusb_writepipe方法;
最后当不再需要的时候一定要记得删除SetupDiGetClassDevs的返回信息,通过调用SetupDiDestroyDeviceInfoList函数即可,关于该函数的详细的介绍请参考下述MSDN网址
<https://msdn.microsoft.com/en-us/library/windows/hardware/ff550996(v=vs.85).aspx>
因为晚上时间有限,写的有不正确的地方希望能指出来,不胜感激。
参考:
http://blog.csdn.NET/tody_guo/article/details/8675237