社区
硬件/系统
帖子详情
USB通讯
adidas_1983_
2009-12-15 11:39:37
要做一个USB通讯,vc的,该先从何处入手?以前做过串口通讯的,用的vc控件。
...全文
744
13
打赏
收藏
USB通讯
要做一个USB通讯,vc的,该先从何处入手?以前做过串口通讯的,用的vc控件。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yuhaijian0112
2012-03-26
打赏
举报
回复
你们有没有自己写的usb调试助手软件啊?
有的话发我:1039877896@qq.com
谢谢!!!
boluomianbao
2011-07-01
打赏
举报
回复
跟楼主一样的情况,学习了
wocow3
2009-12-17
打赏
举报
回复
USB通讯其实麻烦的下位机固件程序,虽然芯片厂商一般会提供一个框架程序,但数据的传输机制还得自己定义
上位机设备驱动相对简单,因为usbd.sys总线驱动已经为我们完成了很多工作,第一次做可以参照ddk例子改个~
个人经验觉得首要还需理解usb2.0协议,USB Complete有时间也最好看看,对usb相关的GUID,注册表讲得很好~
drywell
2009-12-17
打赏
举报
回复
可以看一下USB Complete,写得很详细,但是英文的。有中文版,但是翻译各很差,有不少错漏。你可以看一下关于人机接口设备的应用程序的那章。你的下位机应该也是写成HID类。最重要的是先把设备枚举出来。
huabinsir
2009-12-17
打赏
举报
回复
顶一下
adidas_1983_
2009-12-17
打赏
举报
回复
[Quote=引用 5 楼 drywell 的回复:]
可以看一下USB Complete,写得很详细,但是英文的。有中文版,但是翻译各很差,有不少错漏。你可以看一下关于人机接口设备的应用程序的那章。你的下位机应该也是写成HID类。最重要的是先把设备枚举出来。
[/Quote]
周立功有本书好像还不错,不知道看过没有》?
akcw007
2009-12-17
打赏
举报
回复
用SETUPAPI
yubsh
2009-12-17
打赏
举报
回复
看你怎么用USB,难在硬件选型上。看你是做设备还是做一个简单的接口,是采用带内核的芯片,还是不带内核的外围芯片。
一般地,芯片选定之后,芯片厂家都会提供一个驱动程序,或者DLL,直接与之接口即可。
adidas_1983_
2009-12-16
打赏
举报
回复
[Quote=引用 1 楼 drywell 的回复:]
枚举设备,再打开设备。我这有一段代码,可以参考一下,网上也可以搜得到。USB设备有很多种,要与USB设备通信,就要先获取你的USB设备类的GUID标识,然后再根据GUID来枚举该类的设备。,然后从中找到你的设备。要与USB设备通信,还得先安装DDK,把相应的头文件和库包含进去。
//获取本系统中HID类的GUID标识
HidD_GetHidGuid(&HidGuid);
HDEVINFO hDevInfo;
HANDLE
// 准备查找符合HID规范的USB设备
hDevInfo=SetupDiGetClassDevs
(&HidGuid,
NULL,
NULL,
DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
MessageBox("符合HID规范的USB设备发生错误");
SetupDiDestroyDeviceInfoList(hDevInfo);
return false;
}
DWORD MemberIndex = 0;
BOOL bSuccess = false;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
do
{
bSuccess = SetupDiEnumDeviceInterfaces
(hDevInfo, //已安装的HID设备的信息集的句柄
NULL,
&HidGuid, //HID类设备的GUID
MemberIndex, //起始索引号,函数会自动增加
&DeviceInterfaceData); //用以保存单个设备的信息
if ((!bSuccess) && (GetLastError() == ERROR_NO_MORE_ITEMS))
{
//if(MemberIndex == 0)
// MessageBox("抱歉,未找到可用的USB HID设备!");
//else
//MessageBox("没有更多的可用的USB HID设备!");
SetupDiDestroyDeviceInfoList(hDevInfo);
hHidHandle=NULL;
bIsHIDCon=false;
return false;
}
//若找到了一个USB设备,则获取该设备的细节信息
PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData;
DWORD Length = 0;
SetupDiGetDeviceInterfaceDetail(hDevInfo,
&DeviceInterfaceData,
NULL,
0,
&Length,
NULL);
pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //MUST BE!!!
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,
&DeviceInterfaceData,
pDeviceInterfaceDetailData,
Length,
NULL,
NULL))
{
MessageBox("查找路径设备时出错!");
DisplayError();
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
}
else
//先以查询的方式打开设备句柄
hHidHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath ,
0, //0为查询方式,GENERIC_READ | GENERIC_WRITE为读写
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hHidHandle == INVALID_HANDLE_VALUE)
{
MessageBox("无法打开设备");
DisplayError();
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return false;
}
else
{
HIDD_ATTRIBUTES Attributes;
HidD_GetAttributes(hHidHandle,&Attributes);
//将有关该设备的标识显示出来
HIDP_CAPS hidPCaps;
if (Attributes.VendorID == VendorID && Attributes.ProductID == ProductID)
{
//获取设备的权能信息Capabilities.
PHIDP_PREPARSED_DATA pHidpPreparsedData;
/*****************************************************
API函数: HidD_GetPreparsedData
返回: 一个指向缓存区指针,该缓存区包含有设备的权能信息
条件: 由CreateFile返回的句柄.
不需要直接访问缓存区,但HidP_GetCaps和其它API函数需要一个.
********************************************************/
if (!HidD_GetPreparsedData(hHidHandle,&pHidpPreparsedData))
{
MessageBox("获取 HID PREPARED DATA 失败!");
MessageBox("获取 HID 错误!");
DisplayError();
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return false;
}
NTSTATUS status = HidP_GetCaps(pHidpPreparsedData,&hidPCaps);
if (status == HIDP_STATUS_SUCCESS)
{
//以UsagePage和Usage ID判断,这个需要先定出来
if( hidPCaps.UsagePage==UsagePage && hidPCaps.Usage==UsageID )
{
//找到设备后则以读写的方式打开以进行操作
CloseHandle(hHidHandle);
hHidHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath ,
GENERIC_READ | GENERIC_WRITE, //0为查询方式,GENERIC_READ | GENERIC_WRITE为读写
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
strHIDPath=pDeviceInterfaceDetailData->DevicePath;
/*
此处进行操作
*/
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return true;
}
}
}
//释放句柄资源
CloseHandle(hHidHandle);
}
MemberIndex++;
} while(bSuccess);
[/Quote]
有没有完整的或者是可以参考的书籍介绍一下,网上的有点乱,再有就是下位机是要做的单片机,是和一个操控相连的!
adidas_1983_
2009-12-16
打赏
举报
回复
[Quote=引用楼主 adidas_1983_ 的回复:]
要做一个USB通讯,vc的,该先从何处入手?以前做过串口通讯的,用的vc控件。
[/Quote]
有没有完整的或者是可以参考的书籍介绍一下,网上的有点乱,再有就是下位机是要做的单片机,是和一个操控相连的!
artcpp
2009-12-16
打赏
举报
回复
.
drywell
2009-12-16
打赏
举报
回复
枚举设备,再打开设备。我这有一段代码,可以参考一下,网上也可以搜得到。USB设备有很多种,要与USB设备通信,就要先获取你的USB设备类的GUID标识,然后再根据GUID来枚举该类的设备。,然后从中找到你的设备。要与USB设备通信,还得先安装DDK,把相应的头文件和库包含进去。
//获取本系统中HID类的GUID标识
HidD_GetHidGuid(&HidGuid);
HDEVINFO hDevInfo;
HANDLE
// 准备查找符合HID规范的USB设备
hDevInfo=SetupDiGetClassDevs
(&HidGuid,
NULL,
NULL,
DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
MessageBox("符合HID规范的USB设备发生错误");
SetupDiDestroyDeviceInfoList(hDevInfo);
return false;
}
DWORD MemberIndex = 0;
BOOL bSuccess = false;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
do
{
bSuccess = SetupDiEnumDeviceInterfaces
(hDevInfo, //已安装的HID设备的信息集的句柄
NULL,
&HidGuid, //HID类设备的GUID
MemberIndex, //起始索引号,函数会自动增加
&DeviceInterfaceData); //用以保存单个设备的信息
if ((!bSuccess) && (GetLastError() == ERROR_NO_MORE_ITEMS))
{
//if(MemberIndex == 0)
// MessageBox("抱歉,未找到可用的USB HID设备!");
//else
//MessageBox("没有更多的可用的USB HID设备!");
SetupDiDestroyDeviceInfoList(hDevInfo);
hHidHandle=NULL;
bIsHIDCon=false;
return false;
}
//若找到了一个USB设备,则获取该设备的细节信息
PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData;
DWORD Length = 0;
SetupDiGetDeviceInterfaceDetail(hDevInfo,
&DeviceInterfaceData,
NULL,
0,
&Length,
NULL);
pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //MUST BE!!!
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,
&DeviceInterfaceData,
pDeviceInterfaceDetailData,
Length,
NULL,
NULL))
{
MessageBox("查找路径设备时出错!");
DisplayError();
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
}
else
//先以查询的方式打开设备句柄
hHidHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath ,
0, //0为查询方式,GENERIC_READ | GENERIC_WRITE为读写
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hHidHandle == INVALID_HANDLE_VALUE)
{
MessageBox("无法打开设备");
DisplayError();
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return false;
}
else
{
HIDD_ATTRIBUTES Attributes;
HidD_GetAttributes(hHidHandle,&Attributes);
//将有关该设备的标识显示出来
HIDP_CAPS hidPCaps;
if (Attributes.VendorID == VendorID && Attributes.ProductID == ProductID)
{
//获取设备的权能信息Capabilities.
PHIDP_PREPARSED_DATA pHidpPreparsedData;
/*****************************************************
API函数: HidD_GetPreparsedData
返回: 一个指向缓存区指针,该缓存区包含有设备的权能信息
条件: 由CreateFile返回的句柄.
不需要直接访问缓存区,但HidP_GetCaps和其它API函数需要一个.
********************************************************/
if (!HidD_GetPreparsedData(hHidHandle,&pHidpPreparsedData))
{
MessageBox("获取 HID PREPARED DATA 失败!");
MessageBox("获取 HID 错误!");
DisplayError();
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return false;
}
NTSTATUS status = HidP_GetCaps(pHidpPreparsedData,&hidPCaps);
if (status == HIDP_STATUS_SUCCESS)
{
//以UsagePage和Usage ID判断,这个需要先定出来
if( hidPCaps.UsagePage==UsagePage && hidPCaps.Usage==UsageID )
{
//找到设备后则以读写的方式打开以进行操作
CloseHandle(hHidHandle);
hHidHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath ,
GENERIC_READ | GENERIC_WRITE, //0为查询方式,GENERIC_READ | GENERIC_WRITE为读写
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
strHIDPath=pDeviceInterfaceDetailData->DevicePath;
/*
此处进行操作
*/
free(pDeviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return true;
}
}
}
//释放句柄资源
CloseHandle(hHidHandle);
}
MemberIndex++;
} while(bSuccess);
USB
_HID通信上位机程序VC6.0(真正类似呀呀
USB
工具的源代码).rar
STM32F10X开发板中有个
USB
上位机工具很有用,可以直接与下位机HID设备进行
通讯
,类似于串口调试助手,但没有源代码。在csdn上找了好几个,下载后发现有点号称与呀呀类似,但实际与呀呀有很大的不同,尤其是不能自动...
USB
2.0 to COM Device 串口线 驱动程序
总的来说,
USB
2.0 to COM Device驱动程序是实现
USB
与串口设备间通信的关键,而PL2303芯片则是一种高效、可靠的
USB
到UART转换方案,广泛应用于各种需要串口
通讯
的场合。正确安装和配置此类驱动程序,可以确保用户...
android-
usb
-driver.zip(htc G7
usb
驱动)
总的来说,"android-
usb
-driver.zip"这个压缩包对HTC G7用户来说是必不可少的工具,它确保了设备与电脑之间的正常
通讯
,从而支持数据交换和高级操作如刷机。正确安装和使用
USB
驱动,可以提升用户的使用体验,并为...
QT实现
USB
通讯
QT实现
USB
通讯
这里主要介绍两种方法,一种是通过lib
usb
库来实现
usb
通讯
,一种是通过hidapi库实现通信。 1.介绍lib
usb
库 lib
usb
是一个 C 库,提供对
USB
设备的通用访问。 2.hidapi库介绍 hidapi是一个开源的库,...
USB
通讯
USB
通讯
协议背后涉及到复杂的数据传输机制和协议规范。在
USB
通讯
中,数据传输的基本单元是包(Packet)。多个包组成一个事务(Transaction),而多个事务则组成一个传输(Transfer)。传输在主机软件与
USB
设备特定的...
硬件/系统
2,643
社区成员
17,229
社区内容
发帖
与我相关
我的任务
硬件/系统
VC/MFC 硬件/系统
复制链接
扫一扫
分享
社区描述
VC/MFC 硬件/系统
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章