用C#实现USB端口与HID设备通信,引用windows系统的API函数CreatFile()时,打不开设备,如何解决
在C#中,引用windows系统的API函数CreatFile()时,打不开设备,但是已经获得了设备路径"\\\\?\\hid#vid_09da&pid_000e#6&308e3cf5&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}",为什么还不行,望能人给予帮助!下面列出我的主要代码:
public void UsBMethod(int index)
{
HidD_GetHidGuid(ref guidHID);
hDevInfo = SetupDiGetClassDevs(ref guidHID, 0, IntPtr.Zero, DIGCF.DIGCF_PRESENT | DIGCF.DIGCF_DEVICEINTERFACE);
int bufferSize = 0;
ArrayList HIDUSBAddress = new ArrayList();
//while (true)
//{
//获取设备,true获取到
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData = new SP_DEVICE_INTERFACE_DATA();
DeviceInterfaceData.cbSize = Marshal.SizeOf(DeviceInterfaceData);
//for (int i = 0; i < 3; i++)
//{
bool result = SetupDiEnumDeviceInterfaces(hDevInfo, IntPtr.Zero, ref guidHID, (UInt32)index, ref DeviceInterfaceData);
//}
//第一次调用出错,但可以返回正确的Size
SP_DEVINFO_DATA strtInterfaceData = new SP_DEVINFO_DATA();
result = SetupDiGetDeviceInterfaceDetail(hDevInfo, ref DeviceInterfaceData, IntPtr.Zero, 0, ref bufferSize, strtInterfaceData);
//第二次调用传递返回值,调用即可成功
IntPtr detailDataBuffer = Marshal.AllocHGlobal(bufferSize);
SP_DEVICE_INTERFACE_DETAIL_DATA detailData = new SP_DEVICE_INTERFACE_DETAIL_DATA();
detailData.cbSize = Marshal.SizeOf(typeof(SP_DEVICE_INTERFACE_DETAIL_DATA));
Marshal.StructureToPtr(detailData, detailDataBuffer, false);
result = SetupDiGetDeviceInterfaceDetail(hDevInfo, ref DeviceInterfaceData, detailDataBuffer, bufferSize, ref bufferSize, strtInterfaceData);
if (result == false)
{
return;
//break;
}
//获取设备路径访
IntPtr pdevicePathName = (IntPtr)((int)detailDataBuffer + 4);
string devicePathName = Marshal.PtrToStringAuto(pdevicePathName);
HIDUSBAddress.Add(devicePathName);
//index++;
//break;
//}
//连接设备文件
int aa = CT_CreateFile(devicePathName);
if (aa == 1)
{
Console.WriteLine("read the message is successed!");
}
else Console.WriteLine("read message is failed!");
bool bb = USBDataRead(HidHandle);
}
//建立和设备的连接
public unsafe int CT_CreateFile(string DeviceName)
{
HidHandle = CreateFile(
DeviceName,
GENERIC_READ,//| GENERIC_WRITE,//读写,或者一起
//0,
FILE_SHARE_READ,//| FILE_SHARE_WRITE,//共享读写,或者一起
0,
OPEN_EXISTING,
0,
//FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
0); if (HidHandle == -1)
{
return 0;
//Console.WriteLine("ERROR:{0}", GetLastError());
}
else
{
return 1;
}
}
运行后CreatFile函数不能打开设备,返回不了正确的句柄值!