C++ MFC界面读写USB HID设备数据程序之欧阳育创编Word格式文档下载.docx
- 文档编号:22657713
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:5
- 大小:16.52KB
C++ MFC界面读写USB HID设备数据程序之欧阳育创编Word格式文档下载.docx
《C++ MFC界面读写USB HID设备数据程序之欧阳育创编Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C++ MFC界面读写USB HID设备数据程序之欧阳育创编Word格式文档下载.docx(5页珍藏版)》请在冰豆网上搜索。
handle=SetupDiGetClassDevs(&
deviceId,NULL,NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);
//GetonlyHIDdevices//第三步:
对所有的设备进行枚举//SetupDiEnumDeviceInterfaces();
result1=false;
//定义一些变量result2=false;
CStringtemp11="
"
;
do{DeviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);
result1=SetupDiEnumDeviceInterfaces(handle,NULL,//INPSP_DEVINFO_DATADeviceInfoData,OPTIONAL&
deviceId,Count,&
DeviceInterfaceData);
//获得设备详细数据(初步)SetupDiGetDeviceInterfaceDetail(handle,&
DeviceInterfaceData,NULL,0,&
strSize,NULL);
requiredSize=strSize;
DeviceInterfaceDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize);
DeviceInterfaceDetailData->
cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
DeviceInfoData.cbSize=s第一步:
DeviceInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
//再次获得详细数据result2=SetupDiGetDeviceInterfaceDetail(handle,&
DeviceInterfaceData,DeviceInterfaceDetailData,strSize,&
requiredSize,&
DeviceInfoData);
//获得设备路径(最重要的部分)temp=DeviceInterfaceDetailData->
DevicePath;
UpdateData(FALSE);
m_ctllHIDdevices.AddString(temp);
Count++;
}while(result1);
UpdateData(false);
izeof(SP_DEVINFO_DATA);
时间:
2021.02.04
创作:
欧阳育
第二步:
循环读取HID设备数据(根据用户提供的HID的vendorID和productID),并且把字节解码成二进制,在MFC界面上用LED展示:
为了不影响主线程的运行,我把读取数据的操作,放在一个子线程里!
每隔50ms去读取一次数据!
首先创建一个线程:
HANDLEhThread1;
bStopHID=false;
//这个变量,以后用来停止线程UpdateData(true);
//更新界面,获取变量UpdateData(false);
hThread1=CreateThread(NULL,0,Thread_Enable_Read,(LPVOID)this,NULL,NULL);
在线程的程序里:
CusbhidDlg*p=(CusbhidDlg*)pvParam;
//获取主窗口的指针,用来调用主窗口的变量和函数p->
UpdateData(true);
p->
CStringtemp;
CStringDevicePath;
temp="
SP_DEVINFO_DATADeviceInfoData;
//1GUIDdeviceId;
intvenderID=p->
v_eVendorID;
//从窗口里获取用户输入的VendorIDintproductID=p->
v_eProductID;
//从窗口里获取用户输入的ProductIDunsignedcharinbuffer[2];
//用来存放读取的数据,请在这里定义你自己需要的长度,我每次读一个字节进来unsignedlongnumBytesReturned;
HIDD_ATTRIBUTESdevAttr;
PHIDP_PREPARSED_DATAPreparsedData;
HIDP_CAPSCapabilities;
intreadValue;
boolLED;
intflag=0;
//2HDEVINFOhandle;
//GetonlyHIDdevicesinti=0;
intj=p->
m_ctllHIDdevices.GetCount();
for(i=0;
i<
i++){p->
m_ctllHIDdevices.GetText(i,temp);
DevicePath=temp;
//CreateFile是非常重要的一步,用来建立于HID通信的句柄HANDLEhCom=CreateFile(DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if(hCom==INVALID_HANDLE_VALUE){//AfxMessageBox("
InvalideDevicePath..."
);
continue;
}devAttr.Size=sizeof(HIDD_ATTRIBUTES);
if(!
HidD_GetAttributes(hCom,&
devAttr)){CloseHandle(hCom);
AfxMessageBox("
CannotgettheparametersoftheHID..."
return0;
}//temp.Format("
VendorID:
%d,ProductID:
%d"
devAttr.VendorID,devAttr.ProductID);
//ComparewiththeVendorIDandProductIDfromNakamura-san//AfxMessageBox(temp);
HidD_GetPreparsedData(hCom,&
PreparsedData)){CloseHandle(hCom);
CannotgetthePreparsedData..."
}if(!
HidP_GetCaps(PreparsedData,&
Capabilities)){CloseHandle(hCom);
CannotgettheCapData..."
}if(devAttr.VendorID==venderID&
&
devAttr.ProductID==productID){while
(1){result1=ReadFile(hCom,&
inbuffer[0],Capabilities.InputReportByteLength,&
numBytesReturned,0);
temp=inbuffer;
//p->
m_eDataRead=CString(inbuffer);
if(!
result1){AfxMessageBox("
CannotReadData..."
}readValue=inbuffer[1];
m_eDataRead.Format("
readValue);
//下面是我把数据从10进制转换成二进制,并且点亮LED(一个字节有8个bits,可以点亮8个LEDfor(intk=0;
k<
8;
k++){flag=readValue%2;
readValue=readValue/2;
if(k==0){if(flag==0)p->
m_sDynLED0.SwitchOff();
elsep->
m_sDynLED0.SwitchOn();
}elseif(k==1){if(flag==0)p->
m_sDynLED1.SwitchOff();
m_sDynLED1.SwitchOn();
}elseif(k==2){if(flag==0)p->
m_sDynLED2.SwitchOff();
m_sDynLED2.SwitchOn();
}elseif(k==3){if(flag==0)p->
m_sDynLED3.SwitchOff();
m_sDynLED3.SwitchOn();
}elseif(k==4){if(flag==0)p->
m_sDynLED4.SwitchOff();
m_sDynLED4.SwitchOn();
}elseif(k==5){if(flag==0)p->
m_sDynLED5.SwitchOff();
m_sDynLED5.SwitchOn();
}elseif(k==6){if(flag==0)p->
m_sDynLED6.SwitchOff();
m_sDynLED6.SwitchOn();
}elseif(k==7){if(flag==0)p->
m_sDynLED7.SwitchOff();
m_sDynLED7.SwitchOn();
}}p->
:
Sleep(50);
//判断用户是否点击停止按钮,若是,则退出if(p->
bStopHID){AfxMessageBox("
stopped..."
}}}}if(i==j){AfxMessageBox("
ThereisnosuchHIDdevice..."
}return0;
第三步:
向HID设备写数据(根据用户提供的HID的vendorID和productID),用户输入的是二进制数据:
与读的程序一样,唯一区别就是红色那部分!
intvenderID=v_eVendorID;
intproductID=v_eProductID;
unsignedcharinbuffer[2];
unsignedlongnumBytesReturned;
inbuffer[0]=0;
//把界面里的二进制转换成10进制inbuffer[1]=m_eByte0*1+m_eByte1*2+m_eByte2*4+m_eByte3*8+m_eByte4*16+m_eByte5*32+m_eByte6*64+m_eByte7*128;
v_eDataToWrite=inbuffer[1];
intj=m_ctllHIDdevices.GetCount();
i++){m_ctllHIDdevices.GetText(i,temp);
HANDLEhCom=CreateFile(DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
return;
}//WriteFileif(devAttr.VendorID==venderID&
devAttr.ProductID==productID){result1=WriteFile(hCom,inbuffer,2,&
numBytesReturned,NULL);
//temp=inbuffer;
CannotWriteData..."
}AfxMessageBox("
Suncess..."
break;
}}if(i==j){AfxMessageBox("
}return;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ MFC界面读写USB HID设备数据程序之欧阳育创编 MFC 界面 读写 USB HID 设备 数据 程序 欧阳 创编