当前位置:  技术问答>linux和unix

Ubuntu下怎么枚举usb设备信息?

    来源: 互联网  发布时间:2016-08-28

    本文导语:  小弟初识Linux,在Ubuntu下,不知道有没有函数能够枚举出usb设备,比如我插入一个usb设备A后,怎么通过程序打开A,并对其进行读写操作。小弟是新手,希望前辈们能不吝赐教!谢谢 | http://hi.b...

小弟初识Linux,在Ubuntu下,不知道有没有函数能够枚举出usb设备,比如我插入一个usb设备A后,怎么通过程序打开A,并对其进行读写操作。小弟是新手,希望前辈们能不吝赐教!谢谢

|
http://hi.baidu.com/feifei0730/blog/item/be3c114c24a85bffd62afc16.html

这个应该对lz有帮助:

转:
枚举USB设备

// DeviceManager.cpp : 定义控制台应用程序的入口点。

#include 
#include 
#include 
#include 
#define DIRECTINPUT_VERSION 0x0800
#include 
extern "C"
{
         #include 
}
#include 
#pragma comment(lib, "Dinput8.lib")
#pragma comment(lib, "Dinput.lib")
#pragma comment(lib, "Setupapi.lib") 
#pragma comment(lib, "hid.lib")

GUID myGuid;
LPDIRECTINPUT8 m_lpDI;          // DI8接口指针 

LPDIENUMDEVICESCALLBACK DIEnumDevicesCallback(const DIDEVICEINSTANCE* lpddi, VOID* pvRef)

   *(GUID*) pvRef = lpddi->guidInstance; 
   return DIENUM_STOP;   


int main(void)
{
         GUID HidGuid;

         // 查找本系统中HID类的GUID标识
         HidD_GetHidGuid(&HidGuid);
         printf("系统中HID类的GUID标识为:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02xn",
                HidGuid.Data1,HidGuid.Data2 ,HidGuid.Data3 ,
                HidGuid.Data4[0],HidGuid.Data4[1],HidGuid.Data4[2],
                HidGuid.Data4[3],HidGuid.Data4[4],HidGuid.Data4[5],
                HidGuid.Data4[6],HidGuid.Data4[7]);

         // 准备查找符合HID规范的USB设备
         HDEVINFO hDevInfo = SetupDiGetClassDevs(
                                 &HidGuid,
                                 NULL,
                                 NULL,
                                 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

         if (hDevInfo == INVALID_HANDLE_VALUE)
         {
                 printf("符合HID规范的USB设备发生错误 n");
                 return 0;
         }

         printf("正在查找可用的USB设备。。。。 n");

         DWORD MemberIndex = 0;
         SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
         BOOL bSuccess = FALSE;

         DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
         do
         {
                 bSuccess = SetupDiEnumDeviceInterfaces(
                                         hDevInfo,
                                         NULL,
                                         &HidGuid,
                                         MemberIndex,
                                         &DeviceInterfaceData);
                 if ((!bSuccess) && (GetLastError() == ERROR_NO_MORE_ITEMS))
                 {
                         if(MemberIndex == 0)
                         {
                                 printf("抱歉,未找到可用的USB设备! n");
                         }
                         else
                         {
                                 printf("没有更多的可用的USB设备! n");
                         }
                         SetupDiDestroyDeviceInfoList(hDevInfo);
                         return 0;
                 }
          
                 printf("找到了一个USB设备: n");
                 // 若找到了一个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))
                 {
                         printf("查找路径设备时出错! n");
                 }
                 else
                 {
                         printf("设备路径:%s ", pDeviceInterfaceDetailData->DevicePath);
                 }
                 //打开设备句柄
                 HANDLE hDeviceHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath,
                                 GENERIC_READ | GENERIC_WRITE,
                                 FILE_SHARE_READ | FILE_SHARE_WRITE,
                                 NULL,
                                 OPEN_EXISTING,
                                 0,
                                 NULL);
                 if (hDeviceHandle == INVALID_HANDLE_VALUE)
                 {
                         printf("打开设备路径出错! n");
                         // printf("%d", GetLastError());
                 }
                 else
                 {
                         HIDD_ATTRIBUTES Attributes;
                         HidD_GetAttributes(hDeviceHandle,&Attributes);

    

|
可以看看pci枚举机制
有个hub_scan可以枚举usb口下的级联设备

|
根据你插入的USB的设备文件名来用程序打开

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Ubuntu 12.04长期支持版和最新版Ubuntu 13.10下载
  • vmware里装了Ubuntu后Ubuntu.vmdk文件大小和Ubuntu系统大小区别?
  • Ubuntu查看系统信息命令介绍
  • win7与Ubuntu双系统卸载ubuntu
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • 装ubuntu的时候选安装ubuntu与win7共存与选其他选项
  • Ubuntu查看硬盘,分区相关命令介绍
  • winxp+ubuntu32+ubuntu64是否可以这样装系统?
  • Ubuntu系统安装及升级命令
  • ubuntu能安装rpm包吗&&ubuntu的intel 945显卡驱动
  • Ubuntu Precise 12.04 (LTS) (64-bit)下面安装docker
  • 在win7下装ubuntu成功后进不去ubuntu!!??
  • Ubuntu Raring 13.04 和 Saucy 13.10 (64 bit)下面安装docker
  • 原来已安装好ubuntu,因系统崩溃,重装WINXP系统,如何再次登录ubuntu系统?
  • Ubuntu Trusty 14.04 (LTS) 下面安装docker及依赖关系检查
  • ubuntu10.10 和 ubuntu 10.04.1
  • Ubuntu Vivid 15.04 下面安装docker的详细步骤
  • Ubuntu 中的 ubuntu one 算不算的上云?
  • ubuntu系统中软件安装、卸载以及查询是否已经安装某个软件包的方法
  • 安装ubuntu11.04时,过了ubuntu的logo花屏,怎么解决
  • Ubuntu查看内存,进程相关命令介绍
  • 我想根据ubuntu官网上介绍的方法安装ubuntu,是否应该先分一块硬盘空间?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3