VC USB读写

qq86708160 2011-04-05 09:06:31
小弟想请教一下怎么用VC操纵usb设备读写
...全文
319 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
stushl 2011-04-05
  • 打赏
  • 举报
回复
这是上个星期刚做的usb编程实验
stushl 2011-04-05
  • 打赏
  • 举报
回复
关键是查找设备,读写设备就用句柄用readfile,writefile就行
查找设备:
m_infor=_T("");
// TODO: Add your control notification handler code here
GUID guidHID;
HidD_GetHidGuid(&guidHID);
CString strShow;
strShow.Format("%08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n",
guidHID.Data1,guidHID.Data2,guidHID.Data3,guidHID.Data4[0],
guidHID.Data4[1],guidHID.Data4[2],guidHID.Data4[3],guidHID.Data4[4],
guidHID.Data4[5],guidHID.Data4[6],guidHID.Data4[7]);
m_infor+= _T("1.HID类的GUID标识为:\r\n ")+strShow+_T("\r\n");
m_infor+=_T("2.获得全部HID信息……\r\n ");



HDEVINFO hDevInfo;
hDevInfo=SetupDiGetClassDevs(&guidHID,NULL,NULL,DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE) // 查询全部HID信息失败
{
m_infor+=_T("查询失败 - SetupDiGetClassDevs()");
return ;
}
m_infor=m_infor+_T("获得成功!\r\n")+_T("\r\n")+_T("3.获得特定HID识别信息……\r\n ");

SP_INTERFACE_DEVICE_DATA ifdata;
ifdata.cbSize = sizeof(ifdata);
DWORD devindex;
for (devindex = 0;SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guidHID,devindex, &ifdata); ++devindex)
{
CString num;
num.Format(_T("第(%d)个设备:\r\n "),devindex+1);
m_infor+=num;
DWORD needed;
SetupDiGetDeviceInterfaceDetail(hDevInfo, &ifdata, NULL, 0,&needed, NULL);

PSP_INTERFACE_DEVICE_DETAIL_DATA detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc(needed);
detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
SP_DEVINFO_DATA did = {sizeof(SP_DEVINFO_DATA)};
SetupDiGetDeviceInterfaceDetail(hDevInfo, &ifdata, detail,needed, NULL, &did);
CString devPath(detail->DevicePath);
m_infor+=_T("设备路径:")+devPath+_T("\r\n ");
///////////////////////////////////////////////////////
TCHAR fname[256];
if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &did,SPDRP_FRIENDLYNAME, NULL, (PBYTE) fname, sizeof(fname), NULL)
&& !SetupDiGetDeviceRegistryProperty(hDevInfo, &did, SPDRP_DEVICEDESC,NULL, (PBYTE) fname, sizeof(fname), NULL))
_tcsncpy(fname, detail->DevicePath, 256);

fname[255] = 0;

m_infor+=_T(" 设备类型:");
m_infor+=fname;
m_infor+=_T("\r\n ");
//CDeviceListEntry e(detail->DevicePath, fname);
free((PVOID) detail);
////////////////////////////////////////////////////////


HANDLE hand1 = CreateFile(devPath, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
if (hand1 == INVALID_HANDLE_VALUE)
{
m_infor+=_T(" CreateFile() - 打开失败!\r\n ");
continue;
}
else
{
m_infor+=_T(" CreateFile() - 打开成功!\r\n ");


}


HIDD_ATTRIBUTES attr = {sizeof(HIDD_ATTRIBUTES)};
BOOLEAN okay = HidD_GetAttributes(hand1, &attr);

if (okay)
{
CString tem;
tem.Format("ProductID:%x ,VendorID:%X ,VersionNumber: %x",attr.ProductID,attr.VendorID,attr.VersionNumber);
m_infor+=_T(" ")+tem+_T("\r\n ");
if (attr.ProductID==0x100 && attr.VendorID==0x930A)
{
hand=hand1;
m_receive.EnableWindow();
m_send.EnableWindow();
m_close.EnableWindow();
}

}
///////////////////////////////////////////////////////获得设备能力
m_infor+=_T(" 获得设备能力……\r\n ");
PHIDP_PREPARSED_DATA PreparsedData;

if(HidD_GetPreparsedData(hand1,&PreparsedData))
{
m_infor+=_T(" HidD_GetPreparsedData() - 调用成功! \r\n ");
}



Cap=new HIDP_CAPS;
HidP_GetCaps(PreparsedData,Cap);
m_infor+=_T(" HidP_GetCaps() - 调用成功! \r\n");
CString tmp;
tmp.Format("\
Usage:%d \r\n\
UsagePage:%d \r\n\
InputReportByteLength:%d \r\n\
OutputReportByteLength:%d \r\n\
FeatureReportByteLength:%d \r\n\
NumberLinkCollectionNodes:%d \r\n\
NumberInputButtonCaps:%d \r\n\
NumberInputValueCaps:%d \r\n\
NumberInputDataIndices:%d \r\n\
NumberOutputButtonCaps:%d \r\n\
NumberOutputValueCaps:%d \r\n\
NumberOutputDataIndices:%d \r\n\
NumberFeatureButtonCaps:%d \r\n\
NumberFeatureValueCaps:%d \r\n\
NumberFeatureDataIndices:%d \r\n",
Cap->Usage,
Cap->UsagePage,
Cap->InputReportByteLength,
Cap->OutputReportByteLength,
Cap->FeatureReportByteLength,
Cap->NumberLinkCollectionNodes,
Cap->NumberInputButtonCaps,
Cap->NumberInputValueCaps,
Cap->NumberInputDataIndices,
Cap->NumberOutputButtonCaps,
Cap->NumberOutputValueCaps,
Cap->NumberOutputDataIndices,
Cap->NumberFeatureButtonCaps,
Cap->NumberFeatureValueCaps,
Cap->NumberFeatureDataIndices);
m_infor+=tmp;







/////////////////////////////////////////////////////////


}

SetupDiDestroyDeviceInfoList(hDevInfo);
UpdateData(FALSE);
TandyT 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 visualeleven 的回复:]
http://blog.ednchina.com/asyun/14969/message.aspx
[/Quote]

很好很强大
蒋晟 2011-04-05
  • 打赏
  • 举报
回复
写的数据的格式得依赖于USB另一端设备的驱动程序
chubin1989 2011-04-05
  • 打赏
  • 举报
回复
CFile类是很强大的,CreateFile|ReadFile|WriteFile等能创建很多种文件并读写,文件是一个大的概念,包括很多扩展名的类型,你可以放心大胆的用
oyljerry 2011-04-05
  • 打赏
  • 举报
回复
CreateFile/ReadFile/WriteFile
quwei197874 2011-04-05
  • 打赏
  • 举报
回复
就是调用相应api函数.

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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