当前位置: 代码迷 >> 驱动开发 >> C#操作未知USB设备,类似操作COM口解决方案
  详细解决方案

C#操作未知USB设备,类似操作COM口解决方案

热度:30   发布时间:2016-04-28 10:54:09.0
C#操作未知USB设备,类似操作COM口
如题,没有驱动程序,没有相关说明,如何进行啊,不用C#其他语言也行。
原来帐号丢了,新帐号没多少分,谢谢帮忙!

------解决方案--------------------
未知USB设备,没有设备驱动----那就是说,设备还完全没有工作,没有被配置起来。

这个时候应用程序是访问不到设备的。一定要有设备驱动,在设备驱动里面将USB设备配置成工作状态;然后,驱动为该设备申请对应的系统资源;最后,应用程序才可以用系统题共的API来访问控制设备。
------解决方案--------------------
正如你所说的,类似操作COM口。一般打开一个COM口方法也是CreateFile("com1",,);打开USB设备的方式也一样,首先要找到操作系统分配给USB设备的"名字"(一些API可以用到,比如setupDIGetClassDevs(),SetupDiEnumDeviceInfo...),名字找到后同样的也用CreateFile("Device Name",,)来和这个设备通信。
所以首先设备名字必须存在,也就是USB设备的驱动必须存在(一些通用USB设备Windows已经提供了Class Driver来使用),这样它才能得到相应的设备名字经常和应用程序的通信。
------解决方案--------------------
呵呵,看了你在我的帖子里面留言,我帮你看看

你的usb设备是通用的usb设备吗,我的意思是说,系统自带驱动的。这样的话,你枚举到你的设备,然后打开就可以了。我给你一段代码。这段代码是我枚举usb设备用的,你通过他找到你自己的设备,然后根据intf_detail->DevicePath 作为CreateFile函数的句柄,就可以打开设备了,接着要做的就是传输数据了,和串口差不多,usb传输数据在win32 的api 就3个DeviceIoControl,Readfile,Writefile ,你到网上搜下就明白了。

Device_ERROR CDevice::GetDevice(DWORD instance,
PTCHAR pVID_PID,
PTCHAR pPath,
DWORD dwLen, 
PDWORD pLength) 
{
if(pLength != NULL)*pLength = 0; // Initialization

HDEVINFO info = SetupDiGetClassDevs((LPGUID)&ClassGuid,
NULL,
NULL,
DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);

if(info==INVALID_HANDLE_VALUE)
{
SetupDiDestroyDeviceInfoList(info);
return E_DEV_NO_INFO;
}

// Get interface data for the requested instance
SP_DEVICE_INTERFACE_DATA intf_data;
intf_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

if(!SetupDiEnumDeviceInterfaces(info,
NULL,
(LPGUID)&ClassGuid,
instance,
&intf_data))
{
SetupDiDestroyDeviceInfoList(info);
return E_DEV_INVALID_INST;
}

// Get size of symbolic link
DWORD ReqLen;
SetupDiGetDeviceInterfaceDetail(info, &intf_data, NULL, 0, &ReqLen, NULL);

PSP_DEVICE_INTERFACE_DETAIL_DATA intf_detail = \
(PSP_DEVICE_INTERFACE_DETAIL_DATA)(new char[ReqLen]);

if( intf_detail == NULL)
{
SetupDiDestroyDeviceInfoList(info);
delete intf_detail;
return E_DEV_NO_INFO;
}

// Get symbolic link name
intf_detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

if(!SetupDiGetDeviceInterfaceDetail(info,
&intf_data,
intf_detail,
ReqLen,
NULL,
NULL))
{
SetupDiDestroyDeviceInfoList(info);
delete intf_detail;
return E_DEV_NO_INFO;
}

// Check for a valid VID&PID - if argument is not null)
if(pVID_PID != NULL)
{
if(IsVidPidEqual(intf_detail->DevicePath,pVID_PID) == E_FALSE)
{
SetupDiDestroyDeviceInfoList(info);
delete intf_detail;
return E_DEV_VIDPID_NOT_FOUND;
}
}

// Set the length of the path string
if(pLength != NULL)
*pLength = (DWORD)strlen(intf_detail->DevicePath);

// Copy output string path to buffer pointed to by pPath
if(pPath != NULL)
{
// Check that input buffer has enough room...
// Use > not >= because strlen does not include null

if(dwLen > strlen(intf_detail->DevicePath))
strcpy(pPath, intf_detail->DevicePath);
else
{
SetupDiDestroyDeviceInfoList(info);
delete intf_detail;
return E_FALSE;
}
}
// Clean up
SetupDiDestroyDeviceInfoList(info);
delete intf_detail;
return E_OK;
}

  相关解决方案