VC usb通信有关问题 createfile 失败 急半小时内结贴
VC usb通信问题 createfile 失败 急!!!半小时内结贴
GUID guidHID;
HidD_GetHidGuid(&guidHID);
m_strLog += _T("HID类的GUID标识为\r\n");
// 准备查找符合HID规范的USB设备
HDEVINFO hDevInfo = SetupDiGetClassDevs(&guidHID,NULL,0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
UINT nIndex = 0;
// 查找USB设备接口
SP_DEVICE_INTERFACE_DATA strtInterfaceData;
strtInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
BOOL bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,0,
&strtInterfaceData);
int a =GetLastError();
if (!bSuccess)
{
m_strLog += _T("抱歉,未找到可用的USB设备");
SetupDiDestroyDeviceInfoList(hDevInfo);
return;
}
// 若找到了设备,则读取设备路径名
DWORD Length =0;
PSP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData;
SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,
NULL,0,&Length,NULL);
strtDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LMEM_ZEROINIT,Length);
strtDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,
strtDetailData,Length,NULL,NULL))
{
int a =GetLastError();
AfxMessageBox(_T("查找设备路径时出错!"));
SetupDiDestroyDeviceInfoList(hDevInfo);
return;
}
a =GetLastError();
CString str;
CString str1;
str.Format(_T("%s"),strtDetailData->DevicePath);
// 开放与设备的通信
//获取的设备号为
//str = "\\?\hid#vid_05e0&pid_1200#6&8342214&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
//以上都没有问题
HANDLE hCom = CreateFile(str,GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if (hCom == INVALID_HANDLE_VALUE)
{
int a =GetLastError();
//a= 5 一直卡在这
AfxMessageBox(_T("无法打开通信端口"));
SetupDiDestroyDeviceInfoList(hDevInfo);
return;
}
请问是什原因?
------解决方案--------------------
权限,用管理员权限执行。
------解决方案--------------------
兄弟你好,你的问题解决没有呢?
如何解决呢?
谢谢!
------解决方案--------------------
不是所有的 Hid 设备你都可以 Open 的。
所以,你应该判断是否是你自己可以访问的设备。
难道你需要把 Hid 的键盘和鼠标都 Open 一次吗?
所以,在访问之前判断一下。
------解决方案--------------------
saleayas,我也是网上找的usb的代码在研究,我这边有U盘,和usb 的其他设备,可是为什么每次找到的hid标识总是一样的呢?谢谢。
------解决方案--------------------
因为他们都是 Hid 设备。所以才需要去枚举。
所以需要去匹配 VID, PID 等等。
还需要去匹配你的设备的特定的数据。
诸如 ProductString,SerialNumberString 和 其他的 IndexedString。
以及 Device's Capalibilities。
不是找到一个就是你的,需要去枚举的。
正如 SetupDiEnumDeviceInfo 函数所字面上的意思。
------解决方案--------------------
GUID guidHID;
HidD_GetHidGuid(&guidHID);
m_strLog += _T("HID类的GUID标识为\r\n");
// 准备查找符合HID规范的USB设备
HDEVINFO hDevInfo = SetupDiGetClassDevs(&guidHID,NULL,0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
UINT nIndex = 0;
// 查找USB设备接口
SP_DEVICE_INTERFACE_DATA strtInterfaceData;
strtInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
BOOL bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,0,
&strtInterfaceData);
int a =GetLastError();
if (!bSuccess)
{
m_strLog += _T("抱歉,未找到可用的USB设备");
SetupDiDestroyDeviceInfoList(hDevInfo);
return;
}
// 若找到了设备,则读取设备路径名
DWORD Length =0;
PSP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData;
SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,
NULL,0,&Length,NULL);
strtDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LMEM_ZEROINIT,Length);
strtDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,
strtDetailData,Length,NULL,NULL))
{
int a =GetLastError();
AfxMessageBox(_T("查找设备路径时出错!"));
SetupDiDestroyDeviceInfoList(hDevInfo);
return;
}
a =GetLastError();
CString str;
CString str1;
str.Format(_T("%s"),strtDetailData->DevicePath);
// 开放与设备的通信
//获取的设备号为
//str = "\\?\hid#vid_05e0&pid_1200#6&8342214&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
//以上都没有问题
HANDLE hCom = CreateFile(str,GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if (hCom == INVALID_HANDLE_VALUE)
{
int a =GetLastError();
//a= 5 一直卡在这
AfxMessageBox(_T("无法打开通信端口"));
SetupDiDestroyDeviceInfoList(hDevInfo);
return;
}
请问是什原因?
------解决方案--------------------
权限,用管理员权限执行。
------解决方案--------------------
兄弟你好,你的问题解决没有呢?
如何解决呢?
谢谢!
------解决方案--------------------
不是所有的 Hid 设备你都可以 Open 的。
所以,你应该判断是否是你自己可以访问的设备。
难道你需要把 Hid 的键盘和鼠标都 Open 一次吗?
所以,在访问之前判断一下。
------解决方案--------------------
saleayas,我也是网上找的usb的代码在研究,我这边有U盘,和usb 的其他设备,可是为什么每次找到的hid标识总是一样的呢?谢谢。
------解决方案--------------------
因为他们都是 Hid 设备。所以才需要去枚举。
所以需要去匹配 VID, PID 等等。
还需要去匹配你的设备的特定的数据。
诸如 ProductString,SerialNumberString 和 其他的 IndexedString。
以及 Device's Capalibilities。
不是找到一个就是你的,需要去枚举的。
正如 SetupDiEnumDeviceInfo 函数所字面上的意思。
------解决方案--------------------