用C#实现USB端口与HID设备通信,引用windows系统的API函数CreatFile()时,打不开设备,如何解决

Taylearn-汤包 2012-08-02 09:33:43
在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函数不能打开设备,返回不了正确的句柄值!
...全文
1008 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
css1934 2013-01-07
  • 打赏
  • 举报
回复
楼主,我一直没弄明白,public void UsBMethod(int index)中的index表示什么。在事件中是怎么调用的,可以给个调用的代码看看吗?
宝蓝情调 2012-11-21
  • 打赏
  • 举报
回复
撸主解决了吗。我也在搞这个,还木弄出来
Frog1228 2012-11-21
  • 打赏
  • 举报
回复
这段代码的来源?
江湖评谈 2012-11-21
  • 打赏
  • 举报
回复
这三个api 只是停留在想象阶段 根本不行,而且这段源码也有问题。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧